<?php
/**
 * FlowDefinitionTriggersInner
 *
 * PHP version 7.4
 *
 * @category Class
 * @package  KlaviyoAPI
 * @author   OpenAPI Generator team
 * @link     https://openapi-generator.tech
 */

/**
 * Klaviyo API
 *
 * The Klaviyo REST API. Please visit https://developers.klaviyo.com for more details.
 *
 * Contact: developers@klaviyo.com
 * Generated by: https://openapi-generator.tech
 * OpenAPI Generator version: 6.1.0
 */

/**
 * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
 * https://openapi-generator.tech
 * Do not edit the class manually.
 */

namespace KlaviyoAPI\Model;

use \ArrayAccess;
use \KlaviyoAPI\ObjectSerializer;

/**
 * FlowDefinitionTriggersInner Class Doc Comment
 *
 * @category Class
 * @package  KlaviyoAPI
 * @author   OpenAPI Generator team
 * @link     https://openapi-generator.tech
 * @implements \ArrayAccess<string, mixed>
 */
class FlowDefinitionTriggersInner implements ModelInterface, ArrayAccess, \JsonSerializable
{
    public const DISCRIMINATOR = null;

    /**
      * The original name of the model.
      *
      * @var string
      */
    protected static $openAPIModelName = 'FlowDefinition_triggers_inner';

    /**
      * Array of property to type mappings. Used for (de)serialization
      *
      * @var string[]
      */
    protected static $openAPITypes = [
        'type' => '\KlaviyoAPI\Model\LowInventoryEnum',
        'id' => 'string',
        'trigger_filter' => '\KlaviyoAPI\Model\LowInventoryConditionFilter',
        'date_field_type' => '\KlaviyoAPI\Model\ProfilePropertyEnum',
        'date_profile_property' => 'string',
        'timedelta_unit_before_date' => 'string',
        'timedelta_value_before_date' => 'int',
        'recurrence_frequency' => 'string',
        'timezone' => 'string',
        'trigger_time' => 'string',
        'trigger_days' => 'string[]',
        'price_drop_amount_value' => '\KlaviyoAPI\Model\NumericOperatorFilterValue',
        'price_drop_amount_unit' => 'string',
        'audience' => 'string[]',
        'timeframe_days' => 'int',
        'currency_type' => 'string',
        'product_level' => 'string',
        'inventory_count' => 'int'
    ];

    /**
      * Array of property to format mappings. Used for (de)serialization
      *
      * @var string[]
      * @phpstan-var array<string, string|null>
      * @psalm-var array<string, string|null>
      */
    protected static $openAPIFormats = [
        'type' => null,
        'id' => null,
        'trigger_filter' => null,
        'date_field_type' => null,
        'date_profile_property' => null,
        'timedelta_unit_before_date' => null,
        'timedelta_value_before_date' => null,
        'recurrence_frequency' => null,
        'timezone' => null,
        'trigger_time' => 'time',
        'trigger_days' => null,
        'price_drop_amount_value' => null,
        'price_drop_amount_unit' => null,
        'audience' => null,
        'timeframe_days' => null,
        'currency_type' => null,
        'product_level' => null,
        'inventory_count' => null
    ];

    /**
      * Array of nullable properties. Used for (de)serialization
      *
      * @var boolean[]
      */
    protected static array $openAPINullables = [
        'type' => false,
		'id' => true,
		'trigger_filter' => false,
		'date_field_type' => false,
		'date_profile_property' => false,
		'timedelta_unit_before_date' => false,
		'timedelta_value_before_date' => false,
		'recurrence_frequency' => false,
		'timezone' => false,
		'trigger_time' => false,
		'trigger_days' => true,
		'price_drop_amount_value' => false,
		'price_drop_amount_unit' => false,
		'audience' => false,
		'timeframe_days' => false,
		'currency_type' => false,
		'product_level' => false,
		'inventory_count' => false
    ];

    /**
      * If a nullable field gets set to null, insert it here
      *
      * @var boolean[]
      */
    protected array $openAPINullablesSetToNull = [];

    /**
     * Array of property to type mappings. Used for (de)serialization
     *
     * @return array
     */
    public static function openAPITypes()
    {
        return self::$openAPITypes;
    }

    /**
     * Array of property to format mappings. Used for (de)serialization
     *
     * @return array
     */
    public static function openAPIFormats()
    {
        return self::$openAPIFormats;
    }

    /**
     * Array of nullable properties
     *
     * @return array
     */
    protected static function openAPINullables(): array
    {
        return self::$openAPINullables;
    }

    /**
     * Array of nullable field names deliberately set to null
     *
     * @return boolean[]
     */
    private function getOpenAPINullablesSetToNull(): array
    {
        return $this->openAPINullablesSetToNull;
    }

    /**
     * Checks if a property is nullable
     *
     * @param string $property
     * @return bool
     */
    public static function isNullable(string $property): bool
    {
        return self::openAPINullables()[$property] ?? false;
    }

    /**
     * Checks if a nullable property is set to null.
     *
     * @param string $property
     * @return bool
     */
    public function isNullableSetToNull(string $property): bool
    {
        return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
    }

    /**
     * Array of attributes where the key is the local name,
     * and the value is the original name
     *
     * @var string[]
     */
    protected static $attributeMap = [
        'type' => 'type',
        'id' => 'id',
        'trigger_filter' => 'trigger_filter',
        'date_field_type' => 'date_field_type',
        'date_profile_property' => 'date_profile_property',
        'timedelta_unit_before_date' => 'timedelta_unit_before_date',
        'timedelta_value_before_date' => 'timedelta_value_before_date',
        'recurrence_frequency' => 'recurrence_frequency',
        'timezone' => 'timezone',
        'trigger_time' => 'trigger_time',
        'trigger_days' => 'trigger_days',
        'price_drop_amount_value' => 'price_drop_amount_value',
        'price_drop_amount_unit' => 'price_drop_amount_unit',
        'audience' => 'audience',
        'timeframe_days' => 'timeframe_days',
        'currency_type' => 'currency_type',
        'product_level' => 'product_level',
        'inventory_count' => 'inventory_count'
    ];

    /**
     * Array of attributes to setter functions (for deserialization of responses)
     *
     * @var string[]
     */
    protected static $setters = [
        'type' => 'setType',
        'id' => 'setId',
        'trigger_filter' => 'setTriggerFilter',
        'date_field_type' => 'setDateFieldType',
        'date_profile_property' => 'setDateProfileProperty',
        'timedelta_unit_before_date' => 'setTimedeltaUnitBeforeDate',
        'timedelta_value_before_date' => 'setTimedeltaValueBeforeDate',
        'recurrence_frequency' => 'setRecurrenceFrequency',
        'timezone' => 'setTimezone',
        'trigger_time' => 'setTriggerTime',
        'trigger_days' => 'setTriggerDays',
        'price_drop_amount_value' => 'setPriceDropAmountValue',
        'price_drop_amount_unit' => 'setPriceDropAmountUnit',
        'audience' => 'setAudience',
        'timeframe_days' => 'setTimeframeDays',
        'currency_type' => 'setCurrencyType',
        'product_level' => 'setProductLevel',
        'inventory_count' => 'setInventoryCount'
    ];

    /**
     * Array of attributes to getter functions (for serialization of requests)
     *
     * @var string[]
     */
    protected static $getters = [
        'type' => 'getType',
        'id' => 'getId',
        'trigger_filter' => 'getTriggerFilter',
        'date_field_type' => 'getDateFieldType',
        'date_profile_property' => 'getDateProfileProperty',
        'timedelta_unit_before_date' => 'getTimedeltaUnitBeforeDate',
        'timedelta_value_before_date' => 'getTimedeltaValueBeforeDate',
        'recurrence_frequency' => 'getRecurrenceFrequency',
        'timezone' => 'getTimezone',
        'trigger_time' => 'getTriggerTime',
        'trigger_days' => 'getTriggerDays',
        'price_drop_amount_value' => 'getPriceDropAmountValue',
        'price_drop_amount_unit' => 'getPriceDropAmountUnit',
        'audience' => 'getAudience',
        'timeframe_days' => 'getTimeframeDays',
        'currency_type' => 'getCurrencyType',
        'product_level' => 'getProductLevel',
        'inventory_count' => 'getInventoryCount'
    ];

    /**
     * Array of attributes where the key is the local name,
     * and the value is the original name
     *
     * @return array
     */
    public static function attributeMap()
    {
        return self::$attributeMap;
    }

    /**
     * Array of attributes to setter functions (for deserialization of responses)
     *
     * @return array
     */
    public static function setters()
    {
        return self::$setters;
    }

    /**
     * Array of attributes to getter functions (for serialization of requests)
     *
     * @return array
     */
    public static function getters()
    {
        return self::$getters;
    }

    /**
     * The original name of the model.
     *
     * @return string
     */
    public function getModelName()
    {
        return self::$openAPIModelName;
    }

    public const TIMEDELTA_UNIT_BEFORE_DATE_DAYS = 'days';
    public const TIMEDELTA_UNIT_BEFORE_DATE_MONTHS = 'months';
    public const TIMEDELTA_UNIT_BEFORE_DATE_WEEKS = 'weeks';
    public const RECURRENCE_FREQUENCY_ANNUALLY = 'annually';
    public const RECURRENCE_FREQUENCY_MONTHLY = 'monthly';
    public const RECURRENCE_FREQUENCY_NEVER = 'never';
    public const RECURRENCE_FREQUENCY_WEEKLY = 'weekly';
    public const TIMEZONE_AFRICA_ABIDJAN = 'Africa/Abidjan';
    public const TIMEZONE_AFRICA_ACCRA = 'Africa/Accra';
    public const TIMEZONE_AFRICA_ADDIS_ABABA = 'Africa/Addis_Ababa';
    public const TIMEZONE_AFRICA_ALGIERS = 'Africa/Algiers';
    public const TIMEZONE_AFRICA_ASMARA = 'Africa/Asmara';
    public const TIMEZONE_AFRICA_BAMAKO = 'Africa/Bamako';
    public const TIMEZONE_AFRICA_BANGUI = 'Africa/Bangui';
    public const TIMEZONE_AFRICA_BANJUL = 'Africa/Banjul';
    public const TIMEZONE_AFRICA_BISSAU = 'Africa/Bissau';
    public const TIMEZONE_AFRICA_BLANTYRE = 'Africa/Blantyre';
    public const TIMEZONE_AFRICA_BRAZZAVILLE = 'Africa/Brazzaville';
    public const TIMEZONE_AFRICA_BUJUMBURA = 'Africa/Bujumbura';
    public const TIMEZONE_AFRICA_CAIRO = 'Africa/Cairo';
    public const TIMEZONE_AFRICA_CASABLANCA = 'Africa/Casablanca';
    public const TIMEZONE_AFRICA_CEUTA = 'Africa/Ceuta';
    public const TIMEZONE_AFRICA_CONAKRY = 'Africa/Conakry';
    public const TIMEZONE_AFRICA_DAKAR = 'Africa/Dakar';
    public const TIMEZONE_AFRICA_DAR_ES_SALAAM = 'Africa/Dar_es_Salaam';
    public const TIMEZONE_AFRICA_DJIBOUTI = 'Africa/Djibouti';
    public const TIMEZONE_AFRICA_DOUALA = 'Africa/Douala';
    public const TIMEZONE_AFRICA_EL_AAIUN = 'Africa/El_Aaiun';
    public const TIMEZONE_AFRICA_FREETOWN = 'Africa/Freetown';
    public const TIMEZONE_AFRICA_GABORONE = 'Africa/Gaborone';
    public const TIMEZONE_AFRICA_HARARE = 'Africa/Harare';
    public const TIMEZONE_AFRICA_JOHANNESBURG = 'Africa/Johannesburg';
    public const TIMEZONE_AFRICA_JUBA = 'Africa/Juba';
    public const TIMEZONE_AFRICA_KAMPALA = 'Africa/Kampala';
    public const TIMEZONE_AFRICA_KHARTOUM = 'Africa/Khartoum';
    public const TIMEZONE_AFRICA_KIGALI = 'Africa/Kigali';
    public const TIMEZONE_AFRICA_KINSHASA = 'Africa/Kinshasa';
    public const TIMEZONE_AFRICA_LAGOS = 'Africa/Lagos';
    public const TIMEZONE_AFRICA_LIBREVILLE = 'Africa/Libreville';
    public const TIMEZONE_AFRICA_LOME = 'Africa/Lome';
    public const TIMEZONE_AFRICA_LUANDA = 'Africa/Luanda';
    public const TIMEZONE_AFRICA_LUBUMBASHI = 'Africa/Lubumbashi';
    public const TIMEZONE_AFRICA_LUSAKA = 'Africa/Lusaka';
    public const TIMEZONE_AFRICA_MALABO = 'Africa/Malabo';
    public const TIMEZONE_AFRICA_MAPUTO = 'Africa/Maputo';
    public const TIMEZONE_AFRICA_MASERU = 'Africa/Maseru';
    public const TIMEZONE_AFRICA_MBABANE = 'Africa/Mbabane';
    public const TIMEZONE_AFRICA_MOGADISHU = 'Africa/Mogadishu';
    public const TIMEZONE_AFRICA_MONROVIA = 'Africa/Monrovia';
    public const TIMEZONE_AFRICA_NAIROBI = 'Africa/Nairobi';
    public const TIMEZONE_AFRICA_NDJAMENA = 'Africa/Ndjamena';
    public const TIMEZONE_AFRICA_NIAMEY = 'Africa/Niamey';
    public const TIMEZONE_AFRICA_NOUAKCHOTT = 'Africa/Nouakchott';
    public const TIMEZONE_AFRICA_OUAGADOUGOU = 'Africa/Ouagadougou';
    public const TIMEZONE_AFRICA_PORTO_NOVO = 'Africa/Porto-Novo';
    public const TIMEZONE_AFRICA_SAO_TOME = 'Africa/Sao_Tome';
    public const TIMEZONE_AFRICA_TRIPOLI = 'Africa/Tripoli';
    public const TIMEZONE_AFRICA_TUNIS = 'Africa/Tunis';
    public const TIMEZONE_AFRICA_WINDHOEK = 'Africa/Windhoek';
    public const TIMEZONE_AMERICA_ADAK = 'America/Adak';
    public const TIMEZONE_AMERICA_ANCHORAGE = 'America/Anchorage';
    public const TIMEZONE_AMERICA_ANGUILLA = 'America/Anguilla';
    public const TIMEZONE_AMERICA_ANTIGUA = 'America/Antigua';
    public const TIMEZONE_AMERICA_ARAGUAINA = 'America/Araguaina';
    public const TIMEZONE_AMERICA_ARGENTINA_BUENOS_AIRES = 'America/Argentina/Buenos_Aires';
    public const TIMEZONE_AMERICA_ARGENTINA_CATAMARCA = 'America/Argentina/Catamarca';
    public const TIMEZONE_AMERICA_ARGENTINA_CORDOBA = 'America/Argentina/Cordoba';
    public const TIMEZONE_AMERICA_ARGENTINA_JUJUY = 'America/Argentina/Jujuy';
    public const TIMEZONE_AMERICA_ARGENTINA_LA_RIOJA = 'America/Argentina/La_Rioja';
    public const TIMEZONE_AMERICA_ARGENTINA_MENDOZA = 'America/Argentina/Mendoza';
    public const TIMEZONE_AMERICA_ARGENTINA_RIO_GALLEGOS = 'America/Argentina/Rio_Gallegos';
    public const TIMEZONE_AMERICA_ARGENTINA_SALTA = 'America/Argentina/Salta';
    public const TIMEZONE_AMERICA_ARGENTINA_SAN_JUAN = 'America/Argentina/San_Juan';
    public const TIMEZONE_AMERICA_ARGENTINA_SAN_LUIS = 'America/Argentina/San_Luis';
    public const TIMEZONE_AMERICA_ARGENTINA_TUCUMAN = 'America/Argentina/Tucuman';
    public const TIMEZONE_AMERICA_ARGENTINA_USHUAIA = 'America/Argentina/Ushuaia';
    public const TIMEZONE_AMERICA_ARUBA = 'America/Aruba';
    public const TIMEZONE_AMERICA_ASUNCION = 'America/Asuncion';
    public const TIMEZONE_AMERICA_ATIKOKAN = 'America/Atikokan';
    public const TIMEZONE_AMERICA_BAHIA = 'America/Bahia';
    public const TIMEZONE_AMERICA_BAHIA_BANDERAS = 'America/Bahia_Banderas';
    public const TIMEZONE_AMERICA_BARBADOS = 'America/Barbados';
    public const TIMEZONE_AMERICA_BELEM = 'America/Belem';
    public const TIMEZONE_AMERICA_BELIZE = 'America/Belize';
    public const TIMEZONE_AMERICA_BLANC_SABLON = 'America/Blanc-Sablon';
    public const TIMEZONE_AMERICA_BOA_VISTA = 'America/Boa_Vista';
    public const TIMEZONE_AMERICA_BOGOTA = 'America/Bogota';
    public const TIMEZONE_AMERICA_BOISE = 'America/Boise';
    public const TIMEZONE_AMERICA_CAMBRIDGE_BAY = 'America/Cambridge_Bay';
    public const TIMEZONE_AMERICA_CAMPO_GRANDE = 'America/Campo_Grande';
    public const TIMEZONE_AMERICA_CANCUN = 'America/Cancun';
    public const TIMEZONE_AMERICA_CARACAS = 'America/Caracas';
    public const TIMEZONE_AMERICA_CAYENNE = 'America/Cayenne';
    public const TIMEZONE_AMERICA_CAYMAN = 'America/Cayman';
    public const TIMEZONE_AMERICA_CHICAGO = 'America/Chicago';
    public const TIMEZONE_AMERICA_CHIHUAHUA = 'America/Chihuahua';
    public const TIMEZONE_AMERICA_CIUDAD_JUAREZ = 'America/Ciudad_Juarez';
    public const TIMEZONE_AMERICA_COSTA_RICA = 'America/Costa_Rica';
    public const TIMEZONE_AMERICA_CRESTON = 'America/Creston';
    public const TIMEZONE_AMERICA_CUIABA = 'America/Cuiaba';
    public const TIMEZONE_AMERICA_CURACAO = 'America/Curacao';
    public const TIMEZONE_AMERICA_DANMARKSHAVN = 'America/Danmarkshavn';
    public const TIMEZONE_AMERICA_DAWSON = 'America/Dawson';
    public const TIMEZONE_AMERICA_DAWSON_CREEK = 'America/Dawson_Creek';
    public const TIMEZONE_AMERICA_DENVER = 'America/Denver';
    public const TIMEZONE_AMERICA_DETROIT = 'America/Detroit';
    public const TIMEZONE_AMERICA_DOMINICA = 'America/Dominica';
    public const TIMEZONE_AMERICA_EDMONTON = 'America/Edmonton';
    public const TIMEZONE_AMERICA_EIRUNEPE = 'America/Eirunepe';
    public const TIMEZONE_AMERICA_EL_SALVADOR = 'America/El_Salvador';
    public const TIMEZONE_AMERICA_FORT_NELSON = 'America/Fort_Nelson';
    public const TIMEZONE_AMERICA_FORTALEZA = 'America/Fortaleza';
    public const TIMEZONE_AMERICA_GLACE_BAY = 'America/Glace_Bay';
    public const TIMEZONE_AMERICA_GOOSE_BAY = 'America/Goose_Bay';
    public const TIMEZONE_AMERICA_GRAND_TURK = 'America/Grand_Turk';
    public const TIMEZONE_AMERICA_GRENADA = 'America/Grenada';
    public const TIMEZONE_AMERICA_GUADELOUPE = 'America/Guadeloupe';
    public const TIMEZONE_AMERICA_GUATEMALA = 'America/Guatemala';
    public const TIMEZONE_AMERICA_GUAYAQUIL = 'America/Guayaquil';
    public const TIMEZONE_AMERICA_GUYANA = 'America/Guyana';
    public const TIMEZONE_AMERICA_HALIFAX = 'America/Halifax';
    public const TIMEZONE_AMERICA_HAVANA = 'America/Havana';
    public const TIMEZONE_AMERICA_HERMOSILLO = 'America/Hermosillo';
    public const TIMEZONE_AMERICA_INDIANA_INDIANAPOLIS = 'America/Indiana/Indianapolis';
    public const TIMEZONE_AMERICA_INDIANA_KNOX = 'America/Indiana/Knox';
    public const TIMEZONE_AMERICA_INDIANA_MARENGO = 'America/Indiana/Marengo';
    public const TIMEZONE_AMERICA_INDIANA_PETERSBURG = 'America/Indiana/Petersburg';
    public const TIMEZONE_AMERICA_INDIANA_TELL_CITY = 'America/Indiana/Tell_City';
    public const TIMEZONE_AMERICA_INDIANA_VEVAY = 'America/Indiana/Vevay';
    public const TIMEZONE_AMERICA_INDIANA_VINCENNES = 'America/Indiana/Vincennes';
    public const TIMEZONE_AMERICA_INDIANA_WINAMAC = 'America/Indiana/Winamac';
    public const TIMEZONE_AMERICA_INUVIK = 'America/Inuvik';
    public const TIMEZONE_AMERICA_IQALUIT = 'America/Iqaluit';
    public const TIMEZONE_AMERICA_JAMAICA = 'America/Jamaica';
    public const TIMEZONE_AMERICA_JUNEAU = 'America/Juneau';
    public const TIMEZONE_AMERICA_KENTUCKY_LOUISVILLE = 'America/Kentucky/Louisville';
    public const TIMEZONE_AMERICA_KENTUCKY_MONTICELLO = 'America/Kentucky/Monticello';
    public const TIMEZONE_AMERICA_KRALENDIJK = 'America/Kralendijk';
    public const TIMEZONE_AMERICA_LA_PAZ = 'America/La_Paz';
    public const TIMEZONE_AMERICA_LIMA = 'America/Lima';
    public const TIMEZONE_AMERICA_LOS_ANGELES = 'America/Los_Angeles';
    public const TIMEZONE_AMERICA_LOWER_PRINCES = 'America/Lower_Princes';
    public const TIMEZONE_AMERICA_MACEIO = 'America/Maceio';
    public const TIMEZONE_AMERICA_MANAGUA = 'America/Managua';
    public const TIMEZONE_AMERICA_MANAUS = 'America/Manaus';
    public const TIMEZONE_AMERICA_MARIGOT = 'America/Marigot';
    public const TIMEZONE_AMERICA_MARTINIQUE = 'America/Martinique';
    public const TIMEZONE_AMERICA_MATAMOROS = 'America/Matamoros';
    public const TIMEZONE_AMERICA_MAZATLAN = 'America/Mazatlan';
    public const TIMEZONE_AMERICA_MENOMINEE = 'America/Menominee';
    public const TIMEZONE_AMERICA_MERIDA = 'America/Merida';
    public const TIMEZONE_AMERICA_METLAKATLA = 'America/Metlakatla';
    public const TIMEZONE_AMERICA_MEXICO_CITY = 'America/Mexico_City';
    public const TIMEZONE_AMERICA_MIQUELON = 'America/Miquelon';
    public const TIMEZONE_AMERICA_MONCTON = 'America/Moncton';
    public const TIMEZONE_AMERICA_MONTERREY = 'America/Monterrey';
    public const TIMEZONE_AMERICA_MONTEVIDEO = 'America/Montevideo';
    public const TIMEZONE_AMERICA_MONTSERRAT = 'America/Montserrat';
    public const TIMEZONE_AMERICA_NASSAU = 'America/Nassau';
    public const TIMEZONE_AMERICA_NEW_YORK = 'America/New_York';
    public const TIMEZONE_AMERICA_NOME = 'America/Nome';
    public const TIMEZONE_AMERICA_NORONHA = 'America/Noronha';
    public const TIMEZONE_AMERICA_NORTH_DAKOTA_BEULAH = 'America/North_Dakota/Beulah';
    public const TIMEZONE_AMERICA_NORTH_DAKOTA_CENTER = 'America/North_Dakota/Center';
    public const TIMEZONE_AMERICA_NORTH_DAKOTA_NEW_SALEM = 'America/North_Dakota/New_Salem';
    public const TIMEZONE_AMERICA_NUUK = 'America/Nuuk';
    public const TIMEZONE_AMERICA_OJINAGA = 'America/Ojinaga';
    public const TIMEZONE_AMERICA_PANAMA = 'America/Panama';
    public const TIMEZONE_AMERICA_PARAMARIBO = 'America/Paramaribo';
    public const TIMEZONE_AMERICA_PHOENIX = 'America/Phoenix';
    public const TIMEZONE_AMERICA_PORT_AU_PRINCE = 'America/Port-au-Prince';
    public const TIMEZONE_AMERICA_PORT_OF_SPAIN = 'America/Port_of_Spain';
    public const TIMEZONE_AMERICA_PORTO_VELHO = 'America/Porto_Velho';
    public const TIMEZONE_AMERICA_PUERTO_RICO = 'America/Puerto_Rico';
    public const TIMEZONE_AMERICA_PUNTA_ARENAS = 'America/Punta_Arenas';
    public const TIMEZONE_AMERICA_RANKIN_INLET = 'America/Rankin_Inlet';
    public const TIMEZONE_AMERICA_RECIFE = 'America/Recife';
    public const TIMEZONE_AMERICA_REGINA = 'America/Regina';
    public const TIMEZONE_AMERICA_RESOLUTE = 'America/Resolute';
    public const TIMEZONE_AMERICA_RIO_BRANCO = 'America/Rio_Branco';
    public const TIMEZONE_AMERICA_SANTAREM = 'America/Santarem';
    public const TIMEZONE_AMERICA_SANTIAGO = 'America/Santiago';
    public const TIMEZONE_AMERICA_SANTO_DOMINGO = 'America/Santo_Domingo';
    public const TIMEZONE_AMERICA_SAO_PAULO = 'America/Sao_Paulo';
    public const TIMEZONE_AMERICA_SCORESBYSUND = 'America/Scoresbysund';
    public const TIMEZONE_AMERICA_SITKA = 'America/Sitka';
    public const TIMEZONE_AMERICA_ST_BARTHELEMY = 'America/St_Barthelemy';
    public const TIMEZONE_AMERICA_ST_JOHNS = 'America/St_Johns';
    public const TIMEZONE_AMERICA_ST_KITTS = 'America/St_Kitts';
    public const TIMEZONE_AMERICA_ST_LUCIA = 'America/St_Lucia';
    public const TIMEZONE_AMERICA_ST_THOMAS = 'America/St_Thomas';
    public const TIMEZONE_AMERICA_ST_VINCENT = 'America/St_Vincent';
    public const TIMEZONE_AMERICA_SWIFT_CURRENT = 'America/Swift_Current';
    public const TIMEZONE_AMERICA_TEGUCIGALPA = 'America/Tegucigalpa';
    public const TIMEZONE_AMERICA_THULE = 'America/Thule';
    public const TIMEZONE_AMERICA_TIJUANA = 'America/Tijuana';
    public const TIMEZONE_AMERICA_TORONTO = 'America/Toronto';
    public const TIMEZONE_AMERICA_TORTOLA = 'America/Tortola';
    public const TIMEZONE_AMERICA_VANCOUVER = 'America/Vancouver';
    public const TIMEZONE_AMERICA_WHITEHORSE = 'America/Whitehorse';
    public const TIMEZONE_AMERICA_WINNIPEG = 'America/Winnipeg';
    public const TIMEZONE_AMERICA_YAKUTAT = 'America/Yakutat';
    public const TIMEZONE_ANTARCTICA_CASEY = 'Antarctica/Casey';
    public const TIMEZONE_ANTARCTICA_DAVIS = 'Antarctica/Davis';
    public const TIMEZONE_ANTARCTICA_DUMONT_D_URVILLE = 'Antarctica/DumontDUrville';
    public const TIMEZONE_ANTARCTICA_MACQUARIE = 'Antarctica/Macquarie';
    public const TIMEZONE_ANTARCTICA_MAWSON = 'Antarctica/Mawson';
    public const TIMEZONE_ANTARCTICA_MC_MURDO = 'Antarctica/McMurdo';
    public const TIMEZONE_ANTARCTICA_PALMER = 'Antarctica/Palmer';
    public const TIMEZONE_ANTARCTICA_ROTHERA = 'Antarctica/Rothera';
    public const TIMEZONE_ANTARCTICA_SYOWA = 'Antarctica/Syowa';
    public const TIMEZONE_ANTARCTICA_TROLL = 'Antarctica/Troll';
    public const TIMEZONE_ANTARCTICA_VOSTOK = 'Antarctica/Vostok';
    public const TIMEZONE_ARCTIC_LONGYEARBYEN = 'Arctic/Longyearbyen';
    public const TIMEZONE_ASIA_ADEN = 'Asia/Aden';
    public const TIMEZONE_ASIA_ALMATY = 'Asia/Almaty';
    public const TIMEZONE_ASIA_AMMAN = 'Asia/Amman';
    public const TIMEZONE_ASIA_ANADYR = 'Asia/Anadyr';
    public const TIMEZONE_ASIA_AQTAU = 'Asia/Aqtau';
    public const TIMEZONE_ASIA_AQTOBE = 'Asia/Aqtobe';
    public const TIMEZONE_ASIA_ASHGABAT = 'Asia/Ashgabat';
    public const TIMEZONE_ASIA_ATYRAU = 'Asia/Atyrau';
    public const TIMEZONE_ASIA_BAGHDAD = 'Asia/Baghdad';
    public const TIMEZONE_ASIA_BAHRAIN = 'Asia/Bahrain';
    public const TIMEZONE_ASIA_BAKU = 'Asia/Baku';
    public const TIMEZONE_ASIA_BANGKOK = 'Asia/Bangkok';
    public const TIMEZONE_ASIA_BARNAUL = 'Asia/Barnaul';
    public const TIMEZONE_ASIA_BEIRUT = 'Asia/Beirut';
    public const TIMEZONE_ASIA_BISHKEK = 'Asia/Bishkek';
    public const TIMEZONE_ASIA_BRUNEI = 'Asia/Brunei';
    public const TIMEZONE_ASIA_CHITA = 'Asia/Chita';
    public const TIMEZONE_ASIA_CHOIBALSAN = 'Asia/Choibalsan';
    public const TIMEZONE_ASIA_COLOMBO = 'Asia/Colombo';
    public const TIMEZONE_ASIA_DAMASCUS = 'Asia/Damascus';
    public const TIMEZONE_ASIA_DHAKA = 'Asia/Dhaka';
    public const TIMEZONE_ASIA_DILI = 'Asia/Dili';
    public const TIMEZONE_ASIA_DUBAI = 'Asia/Dubai';
    public const TIMEZONE_ASIA_DUSHANBE = 'Asia/Dushanbe';
    public const TIMEZONE_ASIA_FAMAGUSTA = 'Asia/Famagusta';
    public const TIMEZONE_ASIA_GAZA = 'Asia/Gaza';
    public const TIMEZONE_ASIA_HEBRON = 'Asia/Hebron';
    public const TIMEZONE_ASIA_HO_CHI_MINH = 'Asia/Ho_Chi_Minh';
    public const TIMEZONE_ASIA_HONG_KONG = 'Asia/Hong_Kong';
    public const TIMEZONE_ASIA_HOVD = 'Asia/Hovd';
    public const TIMEZONE_ASIA_IRKUTSK = 'Asia/Irkutsk';
    public const TIMEZONE_ASIA_JAKARTA = 'Asia/Jakarta';
    public const TIMEZONE_ASIA_JAYAPURA = 'Asia/Jayapura';
    public const TIMEZONE_ASIA_JERUSALEM = 'Asia/Jerusalem';
    public const TIMEZONE_ASIA_KABUL = 'Asia/Kabul';
    public const TIMEZONE_ASIA_KAMCHATKA = 'Asia/Kamchatka';
    public const TIMEZONE_ASIA_KARACHI = 'Asia/Karachi';
    public const TIMEZONE_ASIA_KATHMANDU = 'Asia/Kathmandu';
    public const TIMEZONE_ASIA_KHANDYGA = 'Asia/Khandyga';
    public const TIMEZONE_ASIA_KOLKATA = 'Asia/Kolkata';
    public const TIMEZONE_ASIA_KRASNOYARSK = 'Asia/Krasnoyarsk';
    public const TIMEZONE_ASIA_KUALA_LUMPUR = 'Asia/Kuala_Lumpur';
    public const TIMEZONE_ASIA_KUCHING = 'Asia/Kuching';
    public const TIMEZONE_ASIA_KUWAIT = 'Asia/Kuwait';
    public const TIMEZONE_ASIA_MACAU = 'Asia/Macau';
    public const TIMEZONE_ASIA_MAGADAN = 'Asia/Magadan';
    public const TIMEZONE_ASIA_MAKASSAR = 'Asia/Makassar';
    public const TIMEZONE_ASIA_MANILA = 'Asia/Manila';
    public const TIMEZONE_ASIA_MUSCAT = 'Asia/Muscat';
    public const TIMEZONE_ASIA_NICOSIA = 'Asia/Nicosia';
    public const TIMEZONE_ASIA_NOVOKUZNETSK = 'Asia/Novokuznetsk';
    public const TIMEZONE_ASIA_NOVOSIBIRSK = 'Asia/Novosibirsk';
    public const TIMEZONE_ASIA_OMSK = 'Asia/Omsk';
    public const TIMEZONE_ASIA_ORAL = 'Asia/Oral';
    public const TIMEZONE_ASIA_PHNOM_PENH = 'Asia/Phnom_Penh';
    public const TIMEZONE_ASIA_PONTIANAK = 'Asia/Pontianak';
    public const TIMEZONE_ASIA_PYONGYANG = 'Asia/Pyongyang';
    public const TIMEZONE_ASIA_QATAR = 'Asia/Qatar';
    public const TIMEZONE_ASIA_QOSTANAY = 'Asia/Qostanay';
    public const TIMEZONE_ASIA_QYZYLORDA = 'Asia/Qyzylorda';
    public const TIMEZONE_ASIA_RIYADH = 'Asia/Riyadh';
    public const TIMEZONE_ASIA_SAKHALIN = 'Asia/Sakhalin';
    public const TIMEZONE_ASIA_SAMARKAND = 'Asia/Samarkand';
    public const TIMEZONE_ASIA_SEOUL = 'Asia/Seoul';
    public const TIMEZONE_ASIA_SHANGHAI = 'Asia/Shanghai';
    public const TIMEZONE_ASIA_SINGAPORE = 'Asia/Singapore';
    public const TIMEZONE_ASIA_SREDNEKOLYMSK = 'Asia/Srednekolymsk';
    public const TIMEZONE_ASIA_TAIPEI = 'Asia/Taipei';
    public const TIMEZONE_ASIA_TASHKENT = 'Asia/Tashkent';
    public const TIMEZONE_ASIA_TBILISI = 'Asia/Tbilisi';
    public const TIMEZONE_ASIA_TEHRAN = 'Asia/Tehran';
    public const TIMEZONE_ASIA_THIMPHU = 'Asia/Thimphu';
    public const TIMEZONE_ASIA_TOKYO = 'Asia/Tokyo';
    public const TIMEZONE_ASIA_TOMSK = 'Asia/Tomsk';
    public const TIMEZONE_ASIA_ULAANBAATAR = 'Asia/Ulaanbaatar';
    public const TIMEZONE_ASIA_URUMQI = 'Asia/Urumqi';
    public const TIMEZONE_ASIA_UST_NERA = 'Asia/Ust-Nera';
    public const TIMEZONE_ASIA_VIENTIANE = 'Asia/Vientiane';
    public const TIMEZONE_ASIA_VLADIVOSTOK = 'Asia/Vladivostok';
    public const TIMEZONE_ASIA_YAKUTSK = 'Asia/Yakutsk';
    public const TIMEZONE_ASIA_YANGON = 'Asia/Yangon';
    public const TIMEZONE_ASIA_YEKATERINBURG = 'Asia/Yekaterinburg';
    public const TIMEZONE_ASIA_YEREVAN = 'Asia/Yerevan';
    public const TIMEZONE_ATLANTIC_AZORES = 'Atlantic/Azores';
    public const TIMEZONE_ATLANTIC_BERMUDA = 'Atlantic/Bermuda';
    public const TIMEZONE_ATLANTIC_CANARY = 'Atlantic/Canary';
    public const TIMEZONE_ATLANTIC_CAPE_VERDE = 'Atlantic/Cape_Verde';
    public const TIMEZONE_ATLANTIC_FAROE = 'Atlantic/Faroe';
    public const TIMEZONE_ATLANTIC_MADEIRA = 'Atlantic/Madeira';
    public const TIMEZONE_ATLANTIC_REYKJAVIK = 'Atlantic/Reykjavik';
    public const TIMEZONE_ATLANTIC_SOUTH_GEORGIA = 'Atlantic/South_Georgia';
    public const TIMEZONE_ATLANTIC_ST_HELENA = 'Atlantic/St_Helena';
    public const TIMEZONE_ATLANTIC_STANLEY = 'Atlantic/Stanley';
    public const TIMEZONE_AUSTRALIA_ADELAIDE = 'Australia/Adelaide';
    public const TIMEZONE_AUSTRALIA_BRISBANE = 'Australia/Brisbane';
    public const TIMEZONE_AUSTRALIA_BROKEN_HILL = 'Australia/Broken_Hill';
    public const TIMEZONE_AUSTRALIA_DARWIN = 'Australia/Darwin';
    public const TIMEZONE_AUSTRALIA_EUCLA = 'Australia/Eucla';
    public const TIMEZONE_AUSTRALIA_HOBART = 'Australia/Hobart';
    public const TIMEZONE_AUSTRALIA_LINDEMAN = 'Australia/Lindeman';
    public const TIMEZONE_AUSTRALIA_LORD_HOWE = 'Australia/Lord_Howe';
    public const TIMEZONE_AUSTRALIA_MELBOURNE = 'Australia/Melbourne';
    public const TIMEZONE_AUSTRALIA_PERTH = 'Australia/Perth';
    public const TIMEZONE_AUSTRALIA_SYDNEY = 'Australia/Sydney';
    public const TIMEZONE_CANADA_ATLANTIC = 'Canada/Atlantic';
    public const TIMEZONE_CANADA_CENTRAL = 'Canada/Central';
    public const TIMEZONE_CANADA_EASTERN = 'Canada/Eastern';
    public const TIMEZONE_CANADA_MOUNTAIN = 'Canada/Mountain';
    public const TIMEZONE_CANADA_NEWFOUNDLAND = 'Canada/Newfoundland';
    public const TIMEZONE_CANADA_PACIFIC = 'Canada/Pacific';
    public const TIMEZONE_EUROPE_AMSTERDAM = 'Europe/Amsterdam';
    public const TIMEZONE_EUROPE_ANDORRA = 'Europe/Andorra';
    public const TIMEZONE_EUROPE_ASTRAKHAN = 'Europe/Astrakhan';
    public const TIMEZONE_EUROPE_ATHENS = 'Europe/Athens';
    public const TIMEZONE_EUROPE_BELGRADE = 'Europe/Belgrade';
    public const TIMEZONE_EUROPE_BERLIN = 'Europe/Berlin';
    public const TIMEZONE_EUROPE_BRATISLAVA = 'Europe/Bratislava';
    public const TIMEZONE_EUROPE_BRUSSELS = 'Europe/Brussels';
    public const TIMEZONE_EUROPE_BUCHAREST = 'Europe/Bucharest';
    public const TIMEZONE_EUROPE_BUDAPEST = 'Europe/Budapest';
    public const TIMEZONE_EUROPE_BUSINGEN = 'Europe/Busingen';
    public const TIMEZONE_EUROPE_CHISINAU = 'Europe/Chisinau';
    public const TIMEZONE_EUROPE_COPENHAGEN = 'Europe/Copenhagen';
    public const TIMEZONE_EUROPE_DUBLIN = 'Europe/Dublin';
    public const TIMEZONE_EUROPE_GIBRALTAR = 'Europe/Gibraltar';
    public const TIMEZONE_EUROPE_GUERNSEY = 'Europe/Guernsey';
    public const TIMEZONE_EUROPE_HELSINKI = 'Europe/Helsinki';
    public const TIMEZONE_EUROPE_ISLE_OF_MAN = 'Europe/Isle_of_Man';
    public const TIMEZONE_EUROPE_ISTANBUL = 'Europe/Istanbul';
    public const TIMEZONE_EUROPE_JERSEY = 'Europe/Jersey';
    public const TIMEZONE_EUROPE_KALININGRAD = 'Europe/Kaliningrad';
    public const TIMEZONE_EUROPE_KIROV = 'Europe/Kirov';
    public const TIMEZONE_EUROPE_KYIV = 'Europe/Kyiv';
    public const TIMEZONE_EUROPE_LISBON = 'Europe/Lisbon';
    public const TIMEZONE_EUROPE_LJUBLJANA = 'Europe/Ljubljana';
    public const TIMEZONE_EUROPE_LONDON = 'Europe/London';
    public const TIMEZONE_EUROPE_LUXEMBOURG = 'Europe/Luxembourg';
    public const TIMEZONE_EUROPE_MADRID = 'Europe/Madrid';
    public const TIMEZONE_EUROPE_MALTA = 'Europe/Malta';
    public const TIMEZONE_EUROPE_MARIEHAMN = 'Europe/Mariehamn';
    public const TIMEZONE_EUROPE_MINSK = 'Europe/Minsk';
    public const TIMEZONE_EUROPE_MONACO = 'Europe/Monaco';
    public const TIMEZONE_EUROPE_MOSCOW = 'Europe/Moscow';
    public const TIMEZONE_EUROPE_OSLO = 'Europe/Oslo';
    public const TIMEZONE_EUROPE_PARIS = 'Europe/Paris';
    public const TIMEZONE_EUROPE_PODGORICA = 'Europe/Podgorica';
    public const TIMEZONE_EUROPE_PRAGUE = 'Europe/Prague';
    public const TIMEZONE_EUROPE_RIGA = 'Europe/Riga';
    public const TIMEZONE_EUROPE_ROME = 'Europe/Rome';
    public const TIMEZONE_EUROPE_SAMARA = 'Europe/Samara';
    public const TIMEZONE_EUROPE_SAN_MARINO = 'Europe/San_Marino';
    public const TIMEZONE_EUROPE_SARAJEVO = 'Europe/Sarajevo';
    public const TIMEZONE_EUROPE_SARATOV = 'Europe/Saratov';
    public const TIMEZONE_EUROPE_SIMFEROPOL = 'Europe/Simferopol';
    public const TIMEZONE_EUROPE_SKOPJE = 'Europe/Skopje';
    public const TIMEZONE_EUROPE_SOFIA = 'Europe/Sofia';
    public const TIMEZONE_EUROPE_STOCKHOLM = 'Europe/Stockholm';
    public const TIMEZONE_EUROPE_TALLINN = 'Europe/Tallinn';
    public const TIMEZONE_EUROPE_TIRANE = 'Europe/Tirane';
    public const TIMEZONE_EUROPE_ULYANOVSK = 'Europe/Ulyanovsk';
    public const TIMEZONE_EUROPE_VADUZ = 'Europe/Vaduz';
    public const TIMEZONE_EUROPE_VATICAN = 'Europe/Vatican';
    public const TIMEZONE_EUROPE_VIENNA = 'Europe/Vienna';
    public const TIMEZONE_EUROPE_VILNIUS = 'Europe/Vilnius';
    public const TIMEZONE_EUROPE_VOLGOGRAD = 'Europe/Volgograd';
    public const TIMEZONE_EUROPE_WARSAW = 'Europe/Warsaw';
    public const TIMEZONE_EUROPE_ZAGREB = 'Europe/Zagreb';
    public const TIMEZONE_EUROPE_ZURICH = 'Europe/Zurich';
    public const TIMEZONE_GMT = 'GMT';
    public const TIMEZONE_INDIAN_ANTANANARIVO = 'Indian/Antananarivo';
    public const TIMEZONE_INDIAN_CHAGOS = 'Indian/Chagos';
    public const TIMEZONE_INDIAN_CHRISTMAS = 'Indian/Christmas';
    public const TIMEZONE_INDIAN_COCOS = 'Indian/Cocos';
    public const TIMEZONE_INDIAN_COMORO = 'Indian/Comoro';
    public const TIMEZONE_INDIAN_KERGUELEN = 'Indian/Kerguelen';
    public const TIMEZONE_INDIAN_MAHE = 'Indian/Mahe';
    public const TIMEZONE_INDIAN_MALDIVES = 'Indian/Maldives';
    public const TIMEZONE_INDIAN_MAURITIUS = 'Indian/Mauritius';
    public const TIMEZONE_INDIAN_MAYOTTE = 'Indian/Mayotte';
    public const TIMEZONE_INDIAN_REUNION = 'Indian/Reunion';
    public const TIMEZONE_PACIFIC_APIA = 'Pacific/Apia';
    public const TIMEZONE_PACIFIC_AUCKLAND = 'Pacific/Auckland';
    public const TIMEZONE_PACIFIC_BOUGAINVILLE = 'Pacific/Bougainville';
    public const TIMEZONE_PACIFIC_CHATHAM = 'Pacific/Chatham';
    public const TIMEZONE_PACIFIC_CHUUK = 'Pacific/Chuuk';
    public const TIMEZONE_PACIFIC_EASTER = 'Pacific/Easter';
    public const TIMEZONE_PACIFIC_EFATE = 'Pacific/Efate';
    public const TIMEZONE_PACIFIC_FAKAOFO = 'Pacific/Fakaofo';
    public const TIMEZONE_PACIFIC_FIJI = 'Pacific/Fiji';
    public const TIMEZONE_PACIFIC_FUNAFUTI = 'Pacific/Funafuti';
    public const TIMEZONE_PACIFIC_GALAPAGOS = 'Pacific/Galapagos';
    public const TIMEZONE_PACIFIC_GAMBIER = 'Pacific/Gambier';
    public const TIMEZONE_PACIFIC_GUADALCANAL = 'Pacific/Guadalcanal';
    public const TIMEZONE_PACIFIC_GUAM = 'Pacific/Guam';
    public const TIMEZONE_PACIFIC_HONOLULU = 'Pacific/Honolulu';
    public const TIMEZONE_PACIFIC_KANTON = 'Pacific/Kanton';
    public const TIMEZONE_PACIFIC_KIRITIMATI = 'Pacific/Kiritimati';
    public const TIMEZONE_PACIFIC_KOSRAE = 'Pacific/Kosrae';
    public const TIMEZONE_PACIFIC_KWAJALEIN = 'Pacific/Kwajalein';
    public const TIMEZONE_PACIFIC_MAJURO = 'Pacific/Majuro';
    public const TIMEZONE_PACIFIC_MARQUESAS = 'Pacific/Marquesas';
    public const TIMEZONE_PACIFIC_MIDWAY = 'Pacific/Midway';
    public const TIMEZONE_PACIFIC_NAURU = 'Pacific/Nauru';
    public const TIMEZONE_PACIFIC_NIUE = 'Pacific/Niue';
    public const TIMEZONE_PACIFIC_NORFOLK = 'Pacific/Norfolk';
    public const TIMEZONE_PACIFIC_NOUMEA = 'Pacific/Noumea';
    public const TIMEZONE_PACIFIC_PAGO_PAGO = 'Pacific/Pago_Pago';
    public const TIMEZONE_PACIFIC_PALAU = 'Pacific/Palau';
    public const TIMEZONE_PACIFIC_PITCAIRN = 'Pacific/Pitcairn';
    public const TIMEZONE_PACIFIC_POHNPEI = 'Pacific/Pohnpei';
    public const TIMEZONE_PACIFIC_PORT_MORESBY = 'Pacific/Port_Moresby';
    public const TIMEZONE_PACIFIC_RAROTONGA = 'Pacific/Rarotonga';
    public const TIMEZONE_PACIFIC_SAIPAN = 'Pacific/Saipan';
    public const TIMEZONE_PACIFIC_TAHITI = 'Pacific/Tahiti';
    public const TIMEZONE_PACIFIC_TARAWA = 'Pacific/Tarawa';
    public const TIMEZONE_PACIFIC_TONGATAPU = 'Pacific/Tongatapu';
    public const TIMEZONE_PACIFIC_WAKE = 'Pacific/Wake';
    public const TIMEZONE_PACIFIC_WALLIS = 'Pacific/Wallis';
    public const TIMEZONE_US_ALASKA = 'US/Alaska';
    public const TIMEZONE_US_ARIZONA = 'US/Arizona';
    public const TIMEZONE_US_CENTRAL = 'US/Central';
    public const TIMEZONE_US_EASTERN = 'US/Eastern';
    public const TIMEZONE_US_HAWAII = 'US/Hawaii';
    public const TIMEZONE_US_MOUNTAIN = 'US/Mountain';
    public const TIMEZONE_US_PACIFIC = 'US/Pacific';
    public const TIMEZONE_UTC = 'UTC';
    public const TIMEZONE_PROFILE = 'profile';
    public const TRIGGER_DAYS_FRIDAY = 'friday';
    public const TRIGGER_DAYS_MONDAY = 'monday';
    public const TRIGGER_DAYS_SATURDAY = 'saturday';
    public const TRIGGER_DAYS_SUNDAY = 'sunday';
    public const TRIGGER_DAYS_THURSDAY = 'thursday';
    public const TRIGGER_DAYS_TUESDAY = 'tuesday';
    public const TRIGGER_DAYS_WEDNESDAY = 'wednesday';
    public const PRICE_DROP_AMOUNT_UNIT_CURRENCY = 'currency';
    public const PRICE_DROP_AMOUNT_UNIT_PERCENT = 'percent';
    public const AUDIENCE_ADDED_TO_CART = 'added-to-cart';
    public const AUDIENCE_CHECKOUT_STARTED = 'checkout-started';
    public const AUDIENCE_VIEWED = 'viewed';
    public const CURRENCY_TYPE_USD = 'usd';
    public const PRODUCT_LEVEL_PRODUCT = 'product';
    public const PRODUCT_LEVEL_VARIANT = 'variant';

    /**
     * Gets allowable values of the enum
     *
     * @return string[]
     */
    public function getTimedeltaUnitBeforeDateAllowableValues()
    {
        return [
            self::TIMEDELTA_UNIT_BEFORE_DATE_DAYS,
            self::TIMEDELTA_UNIT_BEFORE_DATE_MONTHS,
            self::TIMEDELTA_UNIT_BEFORE_DATE_WEEKS,
        ];
    }

    /**
     * Gets allowable values of the enum
     *
     * @return string[]
     */
    public function getRecurrenceFrequencyAllowableValues()
    {
        return [
            self::RECURRENCE_FREQUENCY_ANNUALLY,
            self::RECURRENCE_FREQUENCY_MONTHLY,
            self::RECURRENCE_FREQUENCY_NEVER,
            self::RECURRENCE_FREQUENCY_WEEKLY,
        ];
    }

    /**
     * Gets allowable values of the enum
     *
     * @return string[]
     */
    public function getTimezoneAllowableValues()
    {
        return [
            self::TIMEZONE_AFRICA_ABIDJAN,
            self::TIMEZONE_AFRICA_ACCRA,
            self::TIMEZONE_AFRICA_ADDIS_ABABA,
            self::TIMEZONE_AFRICA_ALGIERS,
            self::TIMEZONE_AFRICA_ASMARA,
            self::TIMEZONE_AFRICA_BAMAKO,
            self::TIMEZONE_AFRICA_BANGUI,
            self::TIMEZONE_AFRICA_BANJUL,
            self::TIMEZONE_AFRICA_BISSAU,
            self::TIMEZONE_AFRICA_BLANTYRE,
            self::TIMEZONE_AFRICA_BRAZZAVILLE,
            self::TIMEZONE_AFRICA_BUJUMBURA,
            self::TIMEZONE_AFRICA_CAIRO,
            self::TIMEZONE_AFRICA_CASABLANCA,
            self::TIMEZONE_AFRICA_CEUTA,
            self::TIMEZONE_AFRICA_CONAKRY,
            self::TIMEZONE_AFRICA_DAKAR,
            self::TIMEZONE_AFRICA_DAR_ES_SALAAM,
            self::TIMEZONE_AFRICA_DJIBOUTI,
            self::TIMEZONE_AFRICA_DOUALA,
            self::TIMEZONE_AFRICA_EL_AAIUN,
            self::TIMEZONE_AFRICA_FREETOWN,
            self::TIMEZONE_AFRICA_GABORONE,
            self::TIMEZONE_AFRICA_HARARE,
            self::TIMEZONE_AFRICA_JOHANNESBURG,
            self::TIMEZONE_AFRICA_JUBA,
            self::TIMEZONE_AFRICA_KAMPALA,
            self::TIMEZONE_AFRICA_KHARTOUM,
            self::TIMEZONE_AFRICA_KIGALI,
            self::TIMEZONE_AFRICA_KINSHASA,
            self::TIMEZONE_AFRICA_LAGOS,
            self::TIMEZONE_AFRICA_LIBREVILLE,
            self::TIMEZONE_AFRICA_LOME,
            self::TIMEZONE_AFRICA_LUANDA,
            self::TIMEZONE_AFRICA_LUBUMBASHI,
            self::TIMEZONE_AFRICA_LUSAKA,
            self::TIMEZONE_AFRICA_MALABO,
            self::TIMEZONE_AFRICA_MAPUTO,
            self::TIMEZONE_AFRICA_MASERU,
            self::TIMEZONE_AFRICA_MBABANE,
            self::TIMEZONE_AFRICA_MOGADISHU,
            self::TIMEZONE_AFRICA_MONROVIA,
            self::TIMEZONE_AFRICA_NAIROBI,
            self::TIMEZONE_AFRICA_NDJAMENA,
            self::TIMEZONE_AFRICA_NIAMEY,
            self::TIMEZONE_AFRICA_NOUAKCHOTT,
            self::TIMEZONE_AFRICA_OUAGADOUGOU,
            self::TIMEZONE_AFRICA_PORTO_NOVO,
            self::TIMEZONE_AFRICA_SAO_TOME,
            self::TIMEZONE_AFRICA_TRIPOLI,
            self::TIMEZONE_AFRICA_TUNIS,
            self::TIMEZONE_AFRICA_WINDHOEK,
            self::TIMEZONE_AMERICA_ADAK,
            self::TIMEZONE_AMERICA_ANCHORAGE,
            self::TIMEZONE_AMERICA_ANGUILLA,
            self::TIMEZONE_AMERICA_ANTIGUA,
            self::TIMEZONE_AMERICA_ARAGUAINA,
            self::TIMEZONE_AMERICA_ARGENTINA_BUENOS_AIRES,
            self::TIMEZONE_AMERICA_ARGENTINA_CATAMARCA,
            self::TIMEZONE_AMERICA_ARGENTINA_CORDOBA,
            self::TIMEZONE_AMERICA_ARGENTINA_JUJUY,
            self::TIMEZONE_AMERICA_ARGENTINA_LA_RIOJA,
            self::TIMEZONE_AMERICA_ARGENTINA_MENDOZA,
            self::TIMEZONE_AMERICA_ARGENTINA_RIO_GALLEGOS,
            self::TIMEZONE_AMERICA_ARGENTINA_SALTA,
            self::TIMEZONE_AMERICA_ARGENTINA_SAN_JUAN,
            self::TIMEZONE_AMERICA_ARGENTINA_SAN_LUIS,
            self::TIMEZONE_AMERICA_ARGENTINA_TUCUMAN,
            self::TIMEZONE_AMERICA_ARGENTINA_USHUAIA,
            self::TIMEZONE_AMERICA_ARUBA,
            self::TIMEZONE_AMERICA_ASUNCION,
            self::TIMEZONE_AMERICA_ATIKOKAN,
            self::TIMEZONE_AMERICA_BAHIA,
            self::TIMEZONE_AMERICA_BAHIA_BANDERAS,
            self::TIMEZONE_AMERICA_BARBADOS,
            self::TIMEZONE_AMERICA_BELEM,
            self::TIMEZONE_AMERICA_BELIZE,
            self::TIMEZONE_AMERICA_BLANC_SABLON,
            self::TIMEZONE_AMERICA_BOA_VISTA,
            self::TIMEZONE_AMERICA_BOGOTA,
            self::TIMEZONE_AMERICA_BOISE,
            self::TIMEZONE_AMERICA_CAMBRIDGE_BAY,
            self::TIMEZONE_AMERICA_CAMPO_GRANDE,
            self::TIMEZONE_AMERICA_CANCUN,
            self::TIMEZONE_AMERICA_CARACAS,
            self::TIMEZONE_AMERICA_CAYENNE,
            self::TIMEZONE_AMERICA_CAYMAN,
            self::TIMEZONE_AMERICA_CHICAGO,
            self::TIMEZONE_AMERICA_CHIHUAHUA,
            self::TIMEZONE_AMERICA_CIUDAD_JUAREZ,
            self::TIMEZONE_AMERICA_COSTA_RICA,
            self::TIMEZONE_AMERICA_CRESTON,
            self::TIMEZONE_AMERICA_CUIABA,
            self::TIMEZONE_AMERICA_CURACAO,
            self::TIMEZONE_AMERICA_DANMARKSHAVN,
            self::TIMEZONE_AMERICA_DAWSON,
            self::TIMEZONE_AMERICA_DAWSON_CREEK,
            self::TIMEZONE_AMERICA_DENVER,
            self::TIMEZONE_AMERICA_DETROIT,
            self::TIMEZONE_AMERICA_DOMINICA,
            self::TIMEZONE_AMERICA_EDMONTON,
            self::TIMEZONE_AMERICA_EIRUNEPE,
            self::TIMEZONE_AMERICA_EL_SALVADOR,
            self::TIMEZONE_AMERICA_FORT_NELSON,
            self::TIMEZONE_AMERICA_FORTALEZA,
            self::TIMEZONE_AMERICA_GLACE_BAY,
            self::TIMEZONE_AMERICA_GOOSE_BAY,
            self::TIMEZONE_AMERICA_GRAND_TURK,
            self::TIMEZONE_AMERICA_GRENADA,
            self::TIMEZONE_AMERICA_GUADELOUPE,
            self::TIMEZONE_AMERICA_GUATEMALA,
            self::TIMEZONE_AMERICA_GUAYAQUIL,
            self::TIMEZONE_AMERICA_GUYANA,
            self::TIMEZONE_AMERICA_HALIFAX,
            self::TIMEZONE_AMERICA_HAVANA,
            self::TIMEZONE_AMERICA_HERMOSILLO,
            self::TIMEZONE_AMERICA_INDIANA_INDIANAPOLIS,
            self::TIMEZONE_AMERICA_INDIANA_KNOX,
            self::TIMEZONE_AMERICA_INDIANA_MARENGO,
            self::TIMEZONE_AMERICA_INDIANA_PETERSBURG,
            self::TIMEZONE_AMERICA_INDIANA_TELL_CITY,
            self::TIMEZONE_AMERICA_INDIANA_VEVAY,
            self::TIMEZONE_AMERICA_INDIANA_VINCENNES,
            self::TIMEZONE_AMERICA_INDIANA_WINAMAC,
            self::TIMEZONE_AMERICA_INUVIK,
            self::TIMEZONE_AMERICA_IQALUIT,
            self::TIMEZONE_AMERICA_JAMAICA,
            self::TIMEZONE_AMERICA_JUNEAU,
            self::TIMEZONE_AMERICA_KENTUCKY_LOUISVILLE,
            self::TIMEZONE_AMERICA_KENTUCKY_MONTICELLO,
            self::TIMEZONE_AMERICA_KRALENDIJK,
            self::TIMEZONE_AMERICA_LA_PAZ,
            self::TIMEZONE_AMERICA_LIMA,
            self::TIMEZONE_AMERICA_LOS_ANGELES,
            self::TIMEZONE_AMERICA_LOWER_PRINCES,
            self::TIMEZONE_AMERICA_MACEIO,
            self::TIMEZONE_AMERICA_MANAGUA,
            self::TIMEZONE_AMERICA_MANAUS,
            self::TIMEZONE_AMERICA_MARIGOT,
            self::TIMEZONE_AMERICA_MARTINIQUE,
            self::TIMEZONE_AMERICA_MATAMOROS,
            self::TIMEZONE_AMERICA_MAZATLAN,
            self::TIMEZONE_AMERICA_MENOMINEE,
            self::TIMEZONE_AMERICA_MERIDA,
            self::TIMEZONE_AMERICA_METLAKATLA,
            self::TIMEZONE_AMERICA_MEXICO_CITY,
            self::TIMEZONE_AMERICA_MIQUELON,
            self::TIMEZONE_AMERICA_MONCTON,
            self::TIMEZONE_AMERICA_MONTERREY,
            self::TIMEZONE_AMERICA_MONTEVIDEO,
            self::TIMEZONE_AMERICA_MONTSERRAT,
            self::TIMEZONE_AMERICA_NASSAU,
            self::TIMEZONE_AMERICA_NEW_YORK,
            self::TIMEZONE_AMERICA_NOME,
            self::TIMEZONE_AMERICA_NORONHA,
            self::TIMEZONE_AMERICA_NORTH_DAKOTA_BEULAH,
            self::TIMEZONE_AMERICA_NORTH_DAKOTA_CENTER,
            self::TIMEZONE_AMERICA_NORTH_DAKOTA_NEW_SALEM,
            self::TIMEZONE_AMERICA_NUUK,
            self::TIMEZONE_AMERICA_OJINAGA,
            self::TIMEZONE_AMERICA_PANAMA,
            self::TIMEZONE_AMERICA_PARAMARIBO,
            self::TIMEZONE_AMERICA_PHOENIX,
            self::TIMEZONE_AMERICA_PORT_AU_PRINCE,
            self::TIMEZONE_AMERICA_PORT_OF_SPAIN,
            self::TIMEZONE_AMERICA_PORTO_VELHO,
            self::TIMEZONE_AMERICA_PUERTO_RICO,
            self::TIMEZONE_AMERICA_PUNTA_ARENAS,
            self::TIMEZONE_AMERICA_RANKIN_INLET,
            self::TIMEZONE_AMERICA_RECIFE,
            self::TIMEZONE_AMERICA_REGINA,
            self::TIMEZONE_AMERICA_RESOLUTE,
            self::TIMEZONE_AMERICA_RIO_BRANCO,
            self::TIMEZONE_AMERICA_SANTAREM,
            self::TIMEZONE_AMERICA_SANTIAGO,
            self::TIMEZONE_AMERICA_SANTO_DOMINGO,
            self::TIMEZONE_AMERICA_SAO_PAULO,
            self::TIMEZONE_AMERICA_SCORESBYSUND,
            self::TIMEZONE_AMERICA_SITKA,
            self::TIMEZONE_AMERICA_ST_BARTHELEMY,
            self::TIMEZONE_AMERICA_ST_JOHNS,
            self::TIMEZONE_AMERICA_ST_KITTS,
            self::TIMEZONE_AMERICA_ST_LUCIA,
            self::TIMEZONE_AMERICA_ST_THOMAS,
            self::TIMEZONE_AMERICA_ST_VINCENT,
            self::TIMEZONE_AMERICA_SWIFT_CURRENT,
            self::TIMEZONE_AMERICA_TEGUCIGALPA,
            self::TIMEZONE_AMERICA_THULE,
            self::TIMEZONE_AMERICA_TIJUANA,
            self::TIMEZONE_AMERICA_TORONTO,
            self::TIMEZONE_AMERICA_TORTOLA,
            self::TIMEZONE_AMERICA_VANCOUVER,
            self::TIMEZONE_AMERICA_WHITEHORSE,
            self::TIMEZONE_AMERICA_WINNIPEG,
            self::TIMEZONE_AMERICA_YAKUTAT,
            self::TIMEZONE_ANTARCTICA_CASEY,
            self::TIMEZONE_ANTARCTICA_DAVIS,
            self::TIMEZONE_ANTARCTICA_DUMONT_D_URVILLE,
            self::TIMEZONE_ANTARCTICA_MACQUARIE,
            self::TIMEZONE_ANTARCTICA_MAWSON,
            self::TIMEZONE_ANTARCTICA_MC_MURDO,
            self::TIMEZONE_ANTARCTICA_PALMER,
            self::TIMEZONE_ANTARCTICA_ROTHERA,
            self::TIMEZONE_ANTARCTICA_SYOWA,
            self::TIMEZONE_ANTARCTICA_TROLL,
            self::TIMEZONE_ANTARCTICA_VOSTOK,
            self::TIMEZONE_ARCTIC_LONGYEARBYEN,
            self::TIMEZONE_ASIA_ADEN,
            self::TIMEZONE_ASIA_ALMATY,
            self::TIMEZONE_ASIA_AMMAN,
            self::TIMEZONE_ASIA_ANADYR,
            self::TIMEZONE_ASIA_AQTAU,
            self::TIMEZONE_ASIA_AQTOBE,
            self::TIMEZONE_ASIA_ASHGABAT,
            self::TIMEZONE_ASIA_ATYRAU,
            self::TIMEZONE_ASIA_BAGHDAD,
            self::TIMEZONE_ASIA_BAHRAIN,
            self::TIMEZONE_ASIA_BAKU,
            self::TIMEZONE_ASIA_BANGKOK,
            self::TIMEZONE_ASIA_BARNAUL,
            self::TIMEZONE_ASIA_BEIRUT,
            self::TIMEZONE_ASIA_BISHKEK,
            self::TIMEZONE_ASIA_BRUNEI,
            self::TIMEZONE_ASIA_CHITA,
            self::TIMEZONE_ASIA_CHOIBALSAN,
            self::TIMEZONE_ASIA_COLOMBO,
            self::TIMEZONE_ASIA_DAMASCUS,
            self::TIMEZONE_ASIA_DHAKA,
            self::TIMEZONE_ASIA_DILI,
            self::TIMEZONE_ASIA_DUBAI,
            self::TIMEZONE_ASIA_DUSHANBE,
            self::TIMEZONE_ASIA_FAMAGUSTA,
            self::TIMEZONE_ASIA_GAZA,
            self::TIMEZONE_ASIA_HEBRON,
            self::TIMEZONE_ASIA_HO_CHI_MINH,
            self::TIMEZONE_ASIA_HONG_KONG,
            self::TIMEZONE_ASIA_HOVD,
            self::TIMEZONE_ASIA_IRKUTSK,
            self::TIMEZONE_ASIA_JAKARTA,
            self::TIMEZONE_ASIA_JAYAPURA,
            self::TIMEZONE_ASIA_JERUSALEM,
            self::TIMEZONE_ASIA_KABUL,
            self::TIMEZONE_ASIA_KAMCHATKA,
            self::TIMEZONE_ASIA_KARACHI,
            self::TIMEZONE_ASIA_KATHMANDU,
            self::TIMEZONE_ASIA_KHANDYGA,
            self::TIMEZONE_ASIA_KOLKATA,
            self::TIMEZONE_ASIA_KRASNOYARSK,
            self::TIMEZONE_ASIA_KUALA_LUMPUR,
            self::TIMEZONE_ASIA_KUCHING,
            self::TIMEZONE_ASIA_KUWAIT,
            self::TIMEZONE_ASIA_MACAU,
            self::TIMEZONE_ASIA_MAGADAN,
            self::TIMEZONE_ASIA_MAKASSAR,
            self::TIMEZONE_ASIA_MANILA,
            self::TIMEZONE_ASIA_MUSCAT,
            self::TIMEZONE_ASIA_NICOSIA,
            self::TIMEZONE_ASIA_NOVOKUZNETSK,
            self::TIMEZONE_ASIA_NOVOSIBIRSK,
            self::TIMEZONE_ASIA_OMSK,
            self::TIMEZONE_ASIA_ORAL,
            self::TIMEZONE_ASIA_PHNOM_PENH,
            self::TIMEZONE_ASIA_PONTIANAK,
            self::TIMEZONE_ASIA_PYONGYANG,
            self::TIMEZONE_ASIA_QATAR,
            self::TIMEZONE_ASIA_QOSTANAY,
            self::TIMEZONE_ASIA_QYZYLORDA,
            self::TIMEZONE_ASIA_RIYADH,
            self::TIMEZONE_ASIA_SAKHALIN,
            self::TIMEZONE_ASIA_SAMARKAND,
            self::TIMEZONE_ASIA_SEOUL,
            self::TIMEZONE_ASIA_SHANGHAI,
            self::TIMEZONE_ASIA_SINGAPORE,
            self::TIMEZONE_ASIA_SREDNEKOLYMSK,
            self::TIMEZONE_ASIA_TAIPEI,
            self::TIMEZONE_ASIA_TASHKENT,
            self::TIMEZONE_ASIA_TBILISI,
            self::TIMEZONE_ASIA_TEHRAN,
            self::TIMEZONE_ASIA_THIMPHU,
            self::TIMEZONE_ASIA_TOKYO,
            self::TIMEZONE_ASIA_TOMSK,
            self::TIMEZONE_ASIA_ULAANBAATAR,
            self::TIMEZONE_ASIA_URUMQI,
            self::TIMEZONE_ASIA_UST_NERA,
            self::TIMEZONE_ASIA_VIENTIANE,
            self::TIMEZONE_ASIA_VLADIVOSTOK,
            self::TIMEZONE_ASIA_YAKUTSK,
            self::TIMEZONE_ASIA_YANGON,
            self::TIMEZONE_ASIA_YEKATERINBURG,
            self::TIMEZONE_ASIA_YEREVAN,
            self::TIMEZONE_ATLANTIC_AZORES,
            self::TIMEZONE_ATLANTIC_BERMUDA,
            self::TIMEZONE_ATLANTIC_CANARY,
            self::TIMEZONE_ATLANTIC_CAPE_VERDE,
            self::TIMEZONE_ATLANTIC_FAROE,
            self::TIMEZONE_ATLANTIC_MADEIRA,
            self::TIMEZONE_ATLANTIC_REYKJAVIK,
            self::TIMEZONE_ATLANTIC_SOUTH_GEORGIA,
            self::TIMEZONE_ATLANTIC_ST_HELENA,
            self::TIMEZONE_ATLANTIC_STANLEY,
            self::TIMEZONE_AUSTRALIA_ADELAIDE,
            self::TIMEZONE_AUSTRALIA_BRISBANE,
            self::TIMEZONE_AUSTRALIA_BROKEN_HILL,
            self::TIMEZONE_AUSTRALIA_DARWIN,
            self::TIMEZONE_AUSTRALIA_EUCLA,
            self::TIMEZONE_AUSTRALIA_HOBART,
            self::TIMEZONE_AUSTRALIA_LINDEMAN,
            self::TIMEZONE_AUSTRALIA_LORD_HOWE,
            self::TIMEZONE_AUSTRALIA_MELBOURNE,
            self::TIMEZONE_AUSTRALIA_PERTH,
            self::TIMEZONE_AUSTRALIA_SYDNEY,
            self::TIMEZONE_CANADA_ATLANTIC,
            self::TIMEZONE_CANADA_CENTRAL,
            self::TIMEZONE_CANADA_EASTERN,
            self::TIMEZONE_CANADA_MOUNTAIN,
            self::TIMEZONE_CANADA_NEWFOUNDLAND,
            self::TIMEZONE_CANADA_PACIFIC,
            self::TIMEZONE_EUROPE_AMSTERDAM,
            self::TIMEZONE_EUROPE_ANDORRA,
            self::TIMEZONE_EUROPE_ASTRAKHAN,
            self::TIMEZONE_EUROPE_ATHENS,
            self::TIMEZONE_EUROPE_BELGRADE,
            self::TIMEZONE_EUROPE_BERLIN,
            self::TIMEZONE_EUROPE_BRATISLAVA,
            self::TIMEZONE_EUROPE_BRUSSELS,
            self::TIMEZONE_EUROPE_BUCHAREST,
            self::TIMEZONE_EUROPE_BUDAPEST,
            self::TIMEZONE_EUROPE_BUSINGEN,
            self::TIMEZONE_EUROPE_CHISINAU,
            self::TIMEZONE_EUROPE_COPENHAGEN,
            self::TIMEZONE_EUROPE_DUBLIN,
            self::TIMEZONE_EUROPE_GIBRALTAR,
            self::TIMEZONE_EUROPE_GUERNSEY,
            self::TIMEZONE_EUROPE_HELSINKI,
            self::TIMEZONE_EUROPE_ISLE_OF_MAN,
            self::TIMEZONE_EUROPE_ISTANBUL,
            self::TIMEZONE_EUROPE_JERSEY,
            self::TIMEZONE_EUROPE_KALININGRAD,
            self::TIMEZONE_EUROPE_KIROV,
            self::TIMEZONE_EUROPE_KYIV,
            self::TIMEZONE_EUROPE_LISBON,
            self::TIMEZONE_EUROPE_LJUBLJANA,
            self::TIMEZONE_EUROPE_LONDON,
            self::TIMEZONE_EUROPE_LUXEMBOURG,
            self::TIMEZONE_EUROPE_MADRID,
            self::TIMEZONE_EUROPE_MALTA,
            self::TIMEZONE_EUROPE_MARIEHAMN,
            self::TIMEZONE_EUROPE_MINSK,
            self::TIMEZONE_EUROPE_MONACO,
            self::TIMEZONE_EUROPE_MOSCOW,
            self::TIMEZONE_EUROPE_OSLO,
            self::TIMEZONE_EUROPE_PARIS,
            self::TIMEZONE_EUROPE_PODGORICA,
            self::TIMEZONE_EUROPE_PRAGUE,
            self::TIMEZONE_EUROPE_RIGA,
            self::TIMEZONE_EUROPE_ROME,
            self::TIMEZONE_EUROPE_SAMARA,
            self::TIMEZONE_EUROPE_SAN_MARINO,
            self::TIMEZONE_EUROPE_SARAJEVO,
            self::TIMEZONE_EUROPE_SARATOV,
            self::TIMEZONE_EUROPE_SIMFEROPOL,
            self::TIMEZONE_EUROPE_SKOPJE,
            self::TIMEZONE_EUROPE_SOFIA,
            self::TIMEZONE_EUROPE_STOCKHOLM,
            self::TIMEZONE_EUROPE_TALLINN,
            self::TIMEZONE_EUROPE_TIRANE,
            self::TIMEZONE_EUROPE_ULYANOVSK,
            self::TIMEZONE_EUROPE_VADUZ,
            self::TIMEZONE_EUROPE_VATICAN,
            self::TIMEZONE_EUROPE_VIENNA,
            self::TIMEZONE_EUROPE_VILNIUS,
            self::TIMEZONE_EUROPE_VOLGOGRAD,
            self::TIMEZONE_EUROPE_WARSAW,
            self::TIMEZONE_EUROPE_ZAGREB,
            self::TIMEZONE_EUROPE_ZURICH,
            self::TIMEZONE_GMT,
            self::TIMEZONE_INDIAN_ANTANANARIVO,
            self::TIMEZONE_INDIAN_CHAGOS,
            self::TIMEZONE_INDIAN_CHRISTMAS,
            self::TIMEZONE_INDIAN_COCOS,
            self::TIMEZONE_INDIAN_COMORO,
            self::TIMEZONE_INDIAN_KERGUELEN,
            self::TIMEZONE_INDIAN_MAHE,
            self::TIMEZONE_INDIAN_MALDIVES,
            self::TIMEZONE_INDIAN_MAURITIUS,
            self::TIMEZONE_INDIAN_MAYOTTE,
            self::TIMEZONE_INDIAN_REUNION,
            self::TIMEZONE_PACIFIC_APIA,
            self::TIMEZONE_PACIFIC_AUCKLAND,
            self::TIMEZONE_PACIFIC_BOUGAINVILLE,
            self::TIMEZONE_PACIFIC_CHATHAM,
            self::TIMEZONE_PACIFIC_CHUUK,
            self::TIMEZONE_PACIFIC_EASTER,
            self::TIMEZONE_PACIFIC_EFATE,
            self::TIMEZONE_PACIFIC_FAKAOFO,
            self::TIMEZONE_PACIFIC_FIJI,
            self::TIMEZONE_PACIFIC_FUNAFUTI,
            self::TIMEZONE_PACIFIC_GALAPAGOS,
            self::TIMEZONE_PACIFIC_GAMBIER,
            self::TIMEZONE_PACIFIC_GUADALCANAL,
            self::TIMEZONE_PACIFIC_GUAM,
            self::TIMEZONE_PACIFIC_HONOLULU,
            self::TIMEZONE_PACIFIC_KANTON,
            self::TIMEZONE_PACIFIC_KIRITIMATI,
            self::TIMEZONE_PACIFIC_KOSRAE,
            self::TIMEZONE_PACIFIC_KWAJALEIN,
            self::TIMEZONE_PACIFIC_MAJURO,
            self::TIMEZONE_PACIFIC_MARQUESAS,
            self::TIMEZONE_PACIFIC_MIDWAY,
            self::TIMEZONE_PACIFIC_NAURU,
            self::TIMEZONE_PACIFIC_NIUE,
            self::TIMEZONE_PACIFIC_NORFOLK,
            self::TIMEZONE_PACIFIC_NOUMEA,
            self::TIMEZONE_PACIFIC_PAGO_PAGO,
            self::TIMEZONE_PACIFIC_PALAU,
            self::TIMEZONE_PACIFIC_PITCAIRN,
            self::TIMEZONE_PACIFIC_POHNPEI,
            self::TIMEZONE_PACIFIC_PORT_MORESBY,
            self::TIMEZONE_PACIFIC_RAROTONGA,
            self::TIMEZONE_PACIFIC_SAIPAN,
            self::TIMEZONE_PACIFIC_TAHITI,
            self::TIMEZONE_PACIFIC_TARAWA,
            self::TIMEZONE_PACIFIC_TONGATAPU,
            self::TIMEZONE_PACIFIC_WAKE,
            self::TIMEZONE_PACIFIC_WALLIS,
            self::TIMEZONE_US_ALASKA,
            self::TIMEZONE_US_ARIZONA,
            self::TIMEZONE_US_CENTRAL,
            self::TIMEZONE_US_EASTERN,
            self::TIMEZONE_US_HAWAII,
            self::TIMEZONE_US_MOUNTAIN,
            self::TIMEZONE_US_PACIFIC,
            self::TIMEZONE_UTC,
            self::TIMEZONE_PROFILE,
        ];
    }

    /**
     * Gets allowable values of the enum
     *
     * @return string[]
     */
    public function getTriggerDaysAllowableValues()
    {
        return [
            self::TRIGGER_DAYS_FRIDAY,
            self::TRIGGER_DAYS_MONDAY,
            self::TRIGGER_DAYS_SATURDAY,
            self::TRIGGER_DAYS_SUNDAY,
            self::TRIGGER_DAYS_THURSDAY,
            self::TRIGGER_DAYS_TUESDAY,
            self::TRIGGER_DAYS_WEDNESDAY,
        ];
    }

    /**
     * Gets allowable values of the enum
     *
     * @return string[]
     */
    public function getPriceDropAmountUnitAllowableValues()
    {
        return [
            self::PRICE_DROP_AMOUNT_UNIT_CURRENCY,
            self::PRICE_DROP_AMOUNT_UNIT_PERCENT,
        ];
    }

    /**
     * Gets allowable values of the enum
     *
     * @return string[]
     */
    public function getAudienceAllowableValues()
    {
        return [
            self::AUDIENCE_ADDED_TO_CART,
            self::AUDIENCE_CHECKOUT_STARTED,
            self::AUDIENCE_VIEWED,
        ];
    }

    /**
     * Gets allowable values of the enum
     *
     * @return string[]
     */
    public function getCurrencyTypeAllowableValues()
    {
        return [
            self::CURRENCY_TYPE_USD,
        ];
    }

    /**
     * Gets allowable values of the enum
     *
     * @return string[]
     */
    public function getProductLevelAllowableValues()
    {
        return [
            self::PRODUCT_LEVEL_PRODUCT,
            self::PRODUCT_LEVEL_VARIANT,
        ];
    }

    /**
     * Associative array for storing property values
     *
     * @var mixed[]
     */
    protected $container = [];

    /**
     * Constructor
     *
     * @param mixed[] $data Associated array of property values
     *                      initializing the model
     */
    public function __construct(array $data = null)
    {
        $this->setIfExists('type', $data ?? [], null);
        $this->setIfExists('id', $data ?? [], null);
        $this->setIfExists('trigger_filter', $data ?? [], null);
        $this->setIfExists('date_field_type', $data ?? [], null);
        $this->setIfExists('date_profile_property', $data ?? [], null);
        $this->setIfExists('timedelta_unit_before_date', $data ?? [], 'weeks');
        $this->setIfExists('timedelta_value_before_date', $data ?? [], null);
        $this->setIfExists('recurrence_frequency', $data ?? [], 'monthly');
        $this->setIfExists('timezone', $data ?? [], 'profile');
        $this->setIfExists('trigger_time', $data ?? [], null);
        $this->setIfExists('trigger_days', $data ?? [], null);
        $this->setIfExists('price_drop_amount_value', $data ?? [], null);
        $this->setIfExists('price_drop_amount_unit', $data ?? [], 'currency');
        $this->setIfExists('audience', $data ?? [], null);
        $this->setIfExists('timeframe_days', $data ?? [], 30);
        $this->setIfExists('currency_type', $data ?? [], 'usd');
        $this->setIfExists('product_level', $data ?? [], null);
        $this->setIfExists('inventory_count', $data ?? [], null);
    }

    /**
    * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
    * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
    * $this->openAPINullablesSetToNull array
    *
    * @param string $variableName
    * @param array  $fields
    * @param mixed  $defaultValue
    */
    private function setIfExists(string $variableName, array $fields, $defaultValue): void
    {
        if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
            $this->openAPINullablesSetToNull[] = $variableName;
        }

        $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
    }

    /**
     * Show all the invalid properties with reasons.
     *
     * @return array invalid properties with reasons
     */
    public function listInvalidProperties()
    {
        $invalidProperties = [];

        if ($this->container['type'] === null) {
            $invalidProperties[] = "'type' can't be null";
        }
        if ($this->container['trigger_filter'] === null) {
            $invalidProperties[] = "'trigger_filter' can't be null";
        }
        if ($this->container['date_field_type'] === null) {
            $invalidProperties[] = "'date_field_type' can't be null";
        }
        if ($this->container['date_profile_property'] === null) {
            $invalidProperties[] = "'date_profile_property' can't be null";
        }
        $allowedValues = $this->getTimedeltaUnitBeforeDateAllowableValues();
        if (!is_null($this->container['timedelta_unit_before_date']) && !in_array($this->container['timedelta_unit_before_date'], $allowedValues, true)) {
            $invalidProperties[] = sprintf(
                "invalid value '%s' for 'timedelta_unit_before_date', must be one of '%s'",
                $this->container['timedelta_unit_before_date'],
                implode("', '", $allowedValues)
            );
        }

        if ($this->container['timedelta_value_before_date'] === null) {
            $invalidProperties[] = "'timedelta_value_before_date' can't be null";
        }
        $allowedValues = $this->getRecurrenceFrequencyAllowableValues();
        if (!is_null($this->container['recurrence_frequency']) && !in_array($this->container['recurrence_frequency'], $allowedValues, true)) {
            $invalidProperties[] = sprintf(
                "invalid value '%s' for 'recurrence_frequency', must be one of '%s'",
                $this->container['recurrence_frequency'],
                implode("', '", $allowedValues)
            );
        }

        $allowedValues = $this->getTimezoneAllowableValues();
        if (!is_null($this->container['timezone']) && !in_array($this->container['timezone'], $allowedValues, true)) {
            $invalidProperties[] = sprintf(
                "invalid value '%s' for 'timezone', must be one of '%s'",
                $this->container['timezone'],
                implode("', '", $allowedValues)
            );
        }

        if ($this->container['trigger_time'] === null) {
            $invalidProperties[] = "'trigger_time' can't be null";
        }
        if ($this->container['price_drop_amount_value'] === null) {
            $invalidProperties[] = "'price_drop_amount_value' can't be null";
        }
        $allowedValues = $this->getPriceDropAmountUnitAllowableValues();
        if (!is_null($this->container['price_drop_amount_unit']) && !in_array($this->container['price_drop_amount_unit'], $allowedValues, true)) {
            $invalidProperties[] = sprintf(
                "invalid value '%s' for 'price_drop_amount_unit', must be one of '%s'",
                $this->container['price_drop_amount_unit'],
                implode("', '", $allowedValues)
            );
        }

        if ($this->container['audience'] === null) {
            $invalidProperties[] = "'audience' can't be null";
        }
        $allowedValues = $this->getCurrencyTypeAllowableValues();
        if (!is_null($this->container['currency_type']) && !in_array($this->container['currency_type'], $allowedValues, true)) {
            $invalidProperties[] = sprintf(
                "invalid value '%s' for 'currency_type', must be one of '%s'",
                $this->container['currency_type'],
                implode("', '", $allowedValues)
            );
        }

        if ($this->container['product_level'] === null) {
            $invalidProperties[] = "'product_level' can't be null";
        }
        $allowedValues = $this->getProductLevelAllowableValues();
        if (!is_null($this->container['product_level']) && !in_array($this->container['product_level'], $allowedValues, true)) {
            $invalidProperties[] = sprintf(
                "invalid value '%s' for 'product_level', must be one of '%s'",
                $this->container['product_level'],
                implode("', '", $allowedValues)
            );
        }

        if ($this->container['inventory_count'] === null) {
            $invalidProperties[] = "'inventory_count' can't be null";
        }
        return $invalidProperties;
    }

    /**
     * Validate all the properties in the model
     * return true if all passed
     *
     * @return bool True if all properties are valid
     */
    public function valid()
    {
        return count($this->listInvalidProperties()) === 0;
    }


    /**
     * Gets type
     *
     * @return \KlaviyoAPI\Model\LowInventoryEnum
     */
    public function getType()
    {
        return $this->container['type'];
    }

    /**
     * Sets type
     *
     * @param \KlaviyoAPI\Model\LowInventoryEnum $type type
     *
     * @return self
     */
    public function setType($type)
    {

        if (is_null($type)) {
            throw new \InvalidArgumentException('non-nullable type cannot be null');
        }

        $this->container['type'] = $type;

        return $this;
    }

    /**
     * Gets id
     *
     * @return string|null
     */
    public function getId()
    {
        return $this->container['id'];
    }

    /**
     * Sets id
     *
     * @param string|null $id id
     *
     * @return self
     */
    public function setId($id)
    {

        if (is_null($id)) {
            array_push($this->openAPINullablesSetToNull, 'id');
        } else {
            $nullablesSetToNull = $this->getOpenAPINullablesSetToNull();
            $index = array_search('id', $nullablesSetToNull);
            if ($index !== FALSE) {
                unset($nullablesSetToNull[$index]);
                $this->setOpenAPINullablesSetToNull($nullablesSetToNull);
            }
        }

        $this->container['id'] = $id;

        return $this;
    }

    /**
     * Gets trigger_filter
     *
     * @return \KlaviyoAPI\Model\LowInventoryConditionFilter
     */
    public function getTriggerFilter()
    {
        return $this->container['trigger_filter'];
    }

    /**
     * Sets trigger_filter
     *
     * @param \KlaviyoAPI\Model\LowInventoryConditionFilter $trigger_filter trigger_filter
     *
     * @return self
     */
    public function setTriggerFilter($trigger_filter)
    {

        if (is_null($trigger_filter)) {
            throw new \InvalidArgumentException('non-nullable trigger_filter cannot be null');
        }

        $this->container['trigger_filter'] = $trigger_filter;

        return $this;
    }

    /**
     * Gets date_field_type
     *
     * @return \KlaviyoAPI\Model\ProfilePropertyEnum
     */
    public function getDateFieldType()
    {
        return $this->container['date_field_type'];
    }

    /**
     * Sets date_field_type
     *
     * @param \KlaviyoAPI\Model\ProfilePropertyEnum $date_field_type date_field_type
     *
     * @return self
     */
    public function setDateFieldType($date_field_type)
    {

        if (is_null($date_field_type)) {
            throw new \InvalidArgumentException('non-nullable date_field_type cannot be null');
        }

        $this->container['date_field_type'] = $date_field_type;

        return $this;
    }

    /**
     * Gets date_profile_property
     *
     * @return string
     */
    public function getDateProfileProperty()
    {
        return $this->container['date_profile_property'];
    }

    /**
     * Sets date_profile_property
     *
     * @param string $date_profile_property date_profile_property
     *
     * @return self
     */
    public function setDateProfileProperty($date_profile_property)
    {

        if (is_null($date_profile_property)) {
            throw new \InvalidArgumentException('non-nullable date_profile_property cannot be null');
        }

        $this->container['date_profile_property'] = $date_profile_property;

        return $this;
    }

    /**
     * Gets timedelta_unit_before_date
     *
     * @return string|null
     */
    public function getTimedeltaUnitBeforeDate()
    {
        return $this->container['timedelta_unit_before_date'];
    }

    /**
     * Sets timedelta_unit_before_date
     *
     * @param string|null $timedelta_unit_before_date See FlowDateTrigger.UNIT_CHOICES in app and CountdownUnit in fender.
     *
     * @return self
     */
    public function setTimedeltaUnitBeforeDate($timedelta_unit_before_date)
    {
        $allowedValues = $this->getTimedeltaUnitBeforeDateAllowableValues();
        if (!is_null($timedelta_unit_before_date) && !in_array($timedelta_unit_before_date, $allowedValues, true)) {
            throw new \InvalidArgumentException(
                sprintf(
                    "Invalid value '%s' for 'timedelta_unit_before_date', must be one of '%s'",
                    $timedelta_unit_before_date,
                    implode("', '", $allowedValues)
                )
            );
        }

        if (is_null($timedelta_unit_before_date)) {
            throw new \InvalidArgumentException('non-nullable timedelta_unit_before_date cannot be null');
        }

        $this->container['timedelta_unit_before_date'] = $timedelta_unit_before_date;

        return $this;
    }

    /**
     * Gets timedelta_value_before_date
     *
     * @return int
     */
    public function getTimedeltaValueBeforeDate()
    {
        return $this->container['timedelta_value_before_date'];
    }

    /**
     * Sets timedelta_value_before_date
     *
     * @param int $timedelta_value_before_date timedelta_value_before_date
     *
     * @return self
     */
    public function setTimedeltaValueBeforeDate($timedelta_value_before_date)
    {

        if (is_null($timedelta_value_before_date)) {
            throw new \InvalidArgumentException('non-nullable timedelta_value_before_date cannot be null');
        }

        $this->container['timedelta_value_before_date'] = $timedelta_value_before_date;

        return $this;
    }

    /**
     * Gets recurrence_frequency
     *
     * @return string|null
     */
    public function getRecurrenceFrequency()
    {
        return $this->container['recurrence_frequency'];
    }

    /**
     * Sets recurrence_frequency
     *
     * @param string|null $recurrence_frequency aka RepeatTypes in app and RepeatType in fender.
     *
     * @return self
     */
    public function setRecurrenceFrequency($recurrence_frequency)
    {
        $allowedValues = $this->getRecurrenceFrequencyAllowableValues();
        if (!is_null($recurrence_frequency) && !in_array($recurrence_frequency, $allowedValues, true)) {
            throw new \InvalidArgumentException(
                sprintf(
                    "Invalid value '%s' for 'recurrence_frequency', must be one of '%s'",
                    $recurrence_frequency,
                    implode("', '", $allowedValues)
                )
            );
        }

        if (is_null($recurrence_frequency)) {
            throw new \InvalidArgumentException('non-nullable recurrence_frequency cannot be null');
        }

        $this->container['recurrence_frequency'] = $recurrence_frequency;

        return $this;
    }

    /**
     * Gets timezone
     *
     * @return string|null
     */
    public function getTimezone()
    {
        return $this->container['timezone'];
    }

    /**
     * Sets timezone
     *
     * @param string|null $timezone timezone
     *
     * @return self
     */
    public function setTimezone($timezone)
    {
        $allowedValues = $this->getTimezoneAllowableValues();
        if (!is_null($timezone) && !in_array($timezone, $allowedValues, true)) {
            throw new \InvalidArgumentException(
                sprintf(
                    "Invalid value '%s' for 'timezone', must be one of '%s'",
                    $timezone,
                    implode("', '", $allowedValues)
                )
            );
        }

        if (is_null($timezone)) {
            throw new \InvalidArgumentException('non-nullable timezone cannot be null');
        }

        $this->container['timezone'] = $timezone;

        return $this;
    }

    /**
     * Gets trigger_time
     *
     * @return string
     */
    public function getTriggerTime()
    {
        return $this->container['trigger_time'];
    }

    /**
     * Sets trigger_time
     *
     * @param string $trigger_time trigger_time
     *
     * @return self
     */
    public function setTriggerTime($trigger_time)
    {

        if (is_null($trigger_time)) {
            throw new \InvalidArgumentException('non-nullable trigger_time cannot be null');
        }

        $this->container['trigger_time'] = $trigger_time;

        return $this;
    }

    /**
     * Gets trigger_days
     *
     * @return string[]|null
     */
    public function getTriggerDays()
    {
        return $this->container['trigger_days'];
    }

    /**
     * Sets trigger_days
     *
     * @param string[]|null $trigger_days trigger_days
     *
     * @return self
     */
    public function setTriggerDays($trigger_days)
    {
        $allowedValues = $this->getTriggerDaysAllowableValues();
        if (!is_null($trigger_days) && array_diff($trigger_days, $allowedValues)) {
            throw new \InvalidArgumentException(
                sprintf(
                    "Invalid value for 'trigger_days', must be one of '%s'",
                    implode("', '", $allowedValues)
                )
            );
        }

        if (is_null($trigger_days)) {
            array_push($this->openAPINullablesSetToNull, 'trigger_days');
        } else {
            $nullablesSetToNull = $this->getOpenAPINullablesSetToNull();
            $index = array_search('trigger_days', $nullablesSetToNull);
            if ($index !== FALSE) {
                unset($nullablesSetToNull[$index]);
                $this->setOpenAPINullablesSetToNull($nullablesSetToNull);
            }
        }

        $this->container['trigger_days'] = $trigger_days;

        return $this;
    }

    /**
     * Gets price_drop_amount_value
     *
     * @return \KlaviyoAPI\Model\NumericOperatorFilterValue
     */
    public function getPriceDropAmountValue()
    {
        return $this->container['price_drop_amount_value'];
    }

    /**
     * Sets price_drop_amount_value
     *
     * @param \KlaviyoAPI\Model\NumericOperatorFilterValue $price_drop_amount_value price_drop_amount_value
     *
     * @return self
     */
    public function setPriceDropAmountValue($price_drop_amount_value)
    {

        if (is_null($price_drop_amount_value)) {
            throw new \InvalidArgumentException('non-nullable price_drop_amount_value cannot be null');
        }

        $this->container['price_drop_amount_value'] = $price_drop_amount_value;

        return $this;
    }

    /**
     * Gets price_drop_amount_unit
     *
     * @return string|null
     */
    public function getPriceDropAmountUnit()
    {
        return $this->container['price_drop_amount_unit'];
    }

    /**
     * Sets price_drop_amount_unit
     *
     * @param string|null $price_drop_amount_unit Price Drop amount type.
     *
     * @return self
     */
    public function setPriceDropAmountUnit($price_drop_amount_unit)
    {
        $allowedValues = $this->getPriceDropAmountUnitAllowableValues();
        if (!is_null($price_drop_amount_unit) && !in_array($price_drop_amount_unit, $allowedValues, true)) {
            throw new \InvalidArgumentException(
                sprintf(
                    "Invalid value '%s' for 'price_drop_amount_unit', must be one of '%s'",
                    $price_drop_amount_unit,
                    implode("', '", $allowedValues)
                )
            );
        }

        if (is_null($price_drop_amount_unit)) {
            throw new \InvalidArgumentException('non-nullable price_drop_amount_unit cannot be null');
        }

        $this->container['price_drop_amount_unit'] = $price_drop_amount_unit;

        return $this;
    }

    /**
     * Gets audience
     *
     * @return string[]
     */
    public function getAudience()
    {
        return $this->container['audience'];
    }

    /**
     * Sets audience
     *
     * @param string[] $audience audience
     *
     * @return self
     */
    public function setAudience($audience)
    {
        $allowedValues = $this->getAudienceAllowableValues();
        if (array_diff($audience, $allowedValues)) {
            throw new \InvalidArgumentException(
                sprintf(
                    "Invalid value for 'audience', must be one of '%s'",
                    implode("', '", $allowedValues)
                )
            );
        }

        if (is_null($audience)) {
            throw new \InvalidArgumentException('non-nullable audience cannot be null');
        }

        $this->container['audience'] = $audience;

        return $this;
    }

    /**
     * Gets timeframe_days
     *
     * @return int|null
     */
    public function getTimeframeDays()
    {
        return $this->container['timeframe_days'];
    }

    /**
     * Sets timeframe_days
     *
     * @param int|null $timeframe_days timeframe_days
     *
     * @return self
     */
    public function setTimeframeDays($timeframe_days)
    {

        if (is_null($timeframe_days)) {
            throw new \InvalidArgumentException('non-nullable timeframe_days cannot be null');
        }

        $this->container['timeframe_days'] = $timeframe_days;

        return $this;
    }

    /**
     * Gets currency_type
     *
     * @return string|null
     */
    public function getCurrencyType()
    {
        return $this->container['currency_type'];
    }

    /**
     * Sets currency_type
     *
     * @param string|null $currency_type Currency type.
     *
     * @return self
     */
    public function setCurrencyType($currency_type)
    {
        $allowedValues = $this->getCurrencyTypeAllowableValues();
        if (!is_null($currency_type) && !in_array($currency_type, $allowedValues, true)) {
            throw new \InvalidArgumentException(
                sprintf(
                    "Invalid value '%s' for 'currency_type', must be one of '%s'",
                    $currency_type,
                    implode("', '", $allowedValues)
                )
            );
        }

        if (is_null($currency_type)) {
            throw new \InvalidArgumentException('non-nullable currency_type cannot be null');
        }

        $this->container['currency_type'] = $currency_type;

        return $this;
    }

    /**
     * Gets product_level
     *
     * @return string
     */
    public function getProductLevel()
    {
        return $this->container['product_level'];
    }

    /**
     * Sets product_level
     *
     * @param string $product_level Low inventory product level.
     *
     * @return self
     */
    public function setProductLevel($product_level)
    {
        $allowedValues = $this->getProductLevelAllowableValues();
        if (!in_array($product_level, $allowedValues, true)) {
            throw new \InvalidArgumentException(
                sprintf(
                    "Invalid value '%s' for 'product_level', must be one of '%s'",
                    $product_level,
                    implode("', '", $allowedValues)
                )
            );
        }

        if (is_null($product_level)) {
            throw new \InvalidArgumentException('non-nullable product_level cannot be null');
        }

        $this->container['product_level'] = $product_level;

        return $this;
    }

    /**
     * Gets inventory_count
     *
     * @return int
     */
    public function getInventoryCount()
    {
        return $this->container['inventory_count'];
    }

    /**
     * Sets inventory_count
     *
     * @param int $inventory_count inventory_count
     *
     * @return self
     */
    public function setInventoryCount($inventory_count)
    {

        if (is_null($inventory_count)) {
            throw new \InvalidArgumentException('non-nullable inventory_count cannot be null');
        }

        $this->container['inventory_count'] = $inventory_count;

        return $this;
    }
    /**
     * Returns true if offset exists. False otherwise.
     *
     * @param integer $offset Offset
     *
     * @return boolean
     */
    public function offsetExists($offset): bool
    {
        return isset($this->container[$offset]);
    }

    /**
     * Gets offset.
     *
     * @param integer $offset Offset
     *
     * @return mixed|null
     */
    #[\ReturnTypeWillChange]
    public function offsetGet($offset)
    {
        return $this->container[$offset] ?? null;
    }

    /**
     * Sets value based on offset.
     *
     * @param int|null $offset Offset
     * @param mixed    $value  Value to be set
     *
     * @return void
     */
    public function offsetSet($offset, $value): void
    {
        if (is_null($offset)) {
            $this->container[] = $value;
        } else {
            $this->container[$offset] = $value;
        }
    }

    /**
     * Unsets offset.
     *
     * @param integer $offset Offset
     *
     * @return void
     */
    public function offsetUnset($offset): void
    {
        unset($this->container[$offset]);
    }

    /**
     * Serializes the object to a value that can be serialized natively by json_encode().
     * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
     *
     * @return mixed Returns data which can be serialized by json_encode(), which is a value
     * of any type other than a resource.
     */
    #[\ReturnTypeWillChange]
    public function jsonSerialize()
    {
       return ObjectSerializer::sanitizeForSerialization($this);
    }

    /**
     * Gets the string presentation of the object
     *
     * @return string
     */
    public function __toString()
    {
        return json_encode(
            ObjectSerializer::sanitizeForSerialization($this),
            JSON_PRETTY_PRINT
        );
    }

    /**
     * Gets a header-safe presentation of the object
     *
     * @return string
     */
    public function toHeaderValue()
    {
        return json_encode(ObjectSerializer::sanitizeForSerialization($this));
    }
}


