Make no-ec2m work on Win32 build. Add nexprotoneg support too.
authorDr. Stephen Henson <steve@openssl.org>
Sat, 12 Feb 2011 17:38:40 +0000 (17:38 +0000)
committerDr. Stephen Henson <steve@openssl.org>
Sat, 12 Feb 2011 17:38:40 +0000 (17:38 +0000)
util/libeay.num
util/mk1mf.pl
util/mkdef.pl

index 1a657bce2e4eff05e92c144524321289b9b3172e..1aa599f228a5f1ba0335a10fe5c1c335a39e7278 100755 (executable)
@@ -2906,7 +2906,7 @@ STORE_parse_attrs_start                 3343      NOEXIST::FUNCTION:
 POLICY_CONSTRAINTS_free                 3344   EXIST::FUNCTION:
 EVP_PKEY_add1_attr_by_NID               3345   EXIST::FUNCTION:
 BN_nist_mod_192                         3346   EXIST::FUNCTION:
-EC_GROUP_get_trinomial_basis            3347   EXIST::FUNCTION:EC
+EC_GROUP_get_trinomial_basis            3347   EXIST::FUNCTION:EC,EC2M
 STORE_set_method                        3348   NOEXIST::FUNCTION:
 GENERAL_SUBTREE_free                    3349   EXIST::FUNCTION:
 NAME_CONSTRAINTS_it                     3350   EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
@@ -2921,14 +2921,14 @@ SHA512_Update                           3356    EXIST:!VMSVAX:FUNCTION:SHA,SHA512
 i2d_ECPrivateKey                        3357   EXIST::FUNCTION:EC
 BN_get0_nist_prime_192                  3358   EXIST::FUNCTION:
 STORE_modify_certificate                3359   NOEXIST::FUNCTION:
-EC_POINT_set_affine_coordinates_GF2m    3360   EXIST:!VMS:FUNCTION:EC
-EC_POINT_set_affine_coords_GF2m         3360   EXIST:VMS:FUNCTION:EC
-BN_GF2m_mod_exp_arr                     3361   EXIST::FUNCTION:
+EC_POINT_set_affine_coordinates_GF2m    3360   EXIST:!VMS:FUNCTION:EC,EC2M
+EC_POINT_set_affine_coords_GF2m         3360   EXIST:VMS:FUNCTION:EC,EC2M
+BN_GF2m_mod_exp_arr                     3361   EXIST::FUNCTION:EC2M
 STORE_ATTR_INFO_modify_number           3362   NOEXIST::FUNCTION:
 X509_keyid_get0                         3363   EXIST::FUNCTION:
 ENGINE_load_gmp                         3364   EXIST::FUNCTION:ENGINE,GMP,STATIC_ENGINE
 pitem_new                               3365   EXIST::FUNCTION:
-BN_GF2m_mod_mul_arr                     3366   EXIST::FUNCTION:
+BN_GF2m_mod_mul_arr                     3366   EXIST::FUNCTION:EC2M
 STORE_list_public_key_endp              3367   NOEXIST::FUNCTION:
 o2i_ECPublicKey                         3368   EXIST::FUNCTION:EC
 EC_KEY_copy                             3369   EXIST::FUNCTION:EC
@@ -2945,7 +2945,7 @@ X509_VERIFY_PARAM_inherit               3378      EXIST::FUNCTION:
 EC_POINT_point2bn                       3379   EXIST::FUNCTION:EC
 STORE_ATTR_INFO_set_dn                  3380   NOEXIST::FUNCTION:
 X509_policy_tree_get0_policies          3381   EXIST::FUNCTION:
-EC_GROUP_new_curve_GF2m                 3382   EXIST::FUNCTION:EC
+EC_GROUP_new_curve_GF2m                 3382   EXIST::FUNCTION:EC,EC2M
 STORE_destroy_method                    3383   NOEXIST::FUNCTION:
 ENGINE_unregister_STORE                 3384   EXIST::FUNCTION:ENGINE
 EVP_PKEY_get1_EC_KEY                    3385   EXIST::FUNCTION:EC
@@ -2961,7 +2961,7 @@ ENGINE_get_static_state                 3393      EXIST::FUNCTION:ENGINE
 pqueue_iterator                         3394   EXIST::FUNCTION:
 ECDSA_SIG_new                           3395   EXIST::FUNCTION:ECDSA
 OPENSSL_DIR_end                         3396   EXIST::FUNCTION:
-BN_GF2m_mod_sqr                         3397   EXIST::FUNCTION:
+BN_GF2m_mod_sqr                         3397   EXIST::FUNCTION:EC2M
 EC_POINT_bn2point                       3398   EXIST::FUNCTION:EC
 X509_VERIFY_PARAM_set_depth             3399   EXIST::FUNCTION:
 EC_KEY_set_asn1_flag                    3400   EXIST::FUNCTION:EC
@@ -2974,7 +2974,7 @@ EC_GROUP_get_point_conv_form            3405      EXIST:VMS:FUNCTION:EC
 STORE_method_set_store_function         3406   NOEXIST::FUNCTION:
 STORE_ATTR_INFO_in                      3407   NOEXIST::FUNCTION:
 PEM_read_bio_ECPKParameters             3408   EXIST::FUNCTION:EC
-EC_GROUP_get_pentanomial_basis          3409   EXIST::FUNCTION:EC
+EC_GROUP_get_pentanomial_basis          3409   EXIST::FUNCTION:EC,EC2M
 EVP_PKEY_add1_attr_by_txt               3410   EXIST::FUNCTION:
 BN_BLINDING_set_flags                   3411   EXIST::FUNCTION:
 X509_VERIFY_PARAM_set1_policies         3412   EXIST::FUNCTION:
@@ -2982,10 +2982,10 @@ X509_VERIFY_PARAM_set1_name             3413    EXIST::FUNCTION:
 X509_VERIFY_PARAM_set_purpose           3414   EXIST::FUNCTION:
 STORE_get_number                        3415   NOEXIST::FUNCTION:
 ECDSA_sign_setup                        3416   EXIST::FUNCTION:ECDSA
-BN_GF2m_mod_solve_quad_arr              3417   EXIST::FUNCTION:
+BN_GF2m_mod_solve_quad_arr              3417   EXIST::FUNCTION:EC2M
 EC_KEY_up_ref                           3418   EXIST::FUNCTION:EC
 POLICY_MAPPING_free                     3419   EXIST::FUNCTION:
-BN_GF2m_mod_div                         3420   EXIST::FUNCTION:
+BN_GF2m_mod_div                         3420   EXIST::FUNCTION:EC2M
 X509_VERIFY_PARAM_set_flags             3421   EXIST::FUNCTION:
 EC_KEY_free                             3422   EXIST::FUNCTION:EC
 STORE_meth_set_list_next_fn             3423   NOEXIST::FUNCTION:
@@ -2999,7 +2999,7 @@ STORE_method_set_list_end_function      3427      NOEXIST::FUNCTION:
 pqueue_print                            3428   EXIST::FUNCTION:
 EC_GROUP_have_precompute_mult           3429   EXIST::FUNCTION:EC
 EC_KEY_print_fp                         3430   EXIST::FUNCTION:EC,FP_API
-BN_GF2m_mod_arr                         3431   EXIST::FUNCTION:
+BN_GF2m_mod_arr                         3431   EXIST::FUNCTION:EC2M
 PEM_write_bio_X509_CERT_PAIR            3432   EXIST::FUNCTION:
 EVP_PKEY_cmp                            3433   EXIST::FUNCTION:
 X509_policy_level_node_count            3434   EXIST::FUNCTION:
@@ -3020,7 +3020,7 @@ X509_policy_node_get0_qualifiers        3448      EXIST:!VMS:FUNCTION:
 X509_pcy_node_get0_qualifiers           3448   EXIST:VMS:FUNCTION:
 STORE_list_crl_end                      3449   NOEXIST::FUNCTION:
 EVP_PKEY_set1_EC_KEY                    3450   EXIST::FUNCTION:EC
-BN_GF2m_mod_sqrt_arr                    3451   EXIST::FUNCTION:
+BN_GF2m_mod_sqrt_arr                    3451   EXIST::FUNCTION:EC2M
 i2d_ECPrivateKey_bio                    3452   EXIST::FUNCTION:BIO,EC
 ECPKParameters_print_fp                 3453   EXIST::FUNCTION:EC,FP_API
 pqueue_find                             3454   EXIST::FUNCTION:
@@ -3037,7 +3037,7 @@ PKCS12_add_safes                        3464      EXIST::FUNCTION:
 BN_BLINDING_convert_ex                  3465   EXIST::FUNCTION:
 X509_policy_tree_free                   3466   EXIST::FUNCTION:
 OPENSSL_ia32cap_loc                     3467   EXIST::FUNCTION:
-BN_GF2m_poly2arr                        3468   EXIST::FUNCTION:
+BN_GF2m_poly2arr                        3468   EXIST::FUNCTION:EC2M
 STORE_ctrl                              3469   NOEXIST::FUNCTION:
 STORE_ATTR_INFO_compare                 3470   NOEXIST::FUNCTION:
 BN_get0_nist_prime_224                  3471   EXIST::FUNCTION:
@@ -3061,7 +3061,7 @@ STORE_method_set_delete_function        3486      NOEXIST::FUNCTION:
 STORE_list_certificate_next             3487   NOEXIST::FUNCTION:
 ASN1_generate_nconf                     3488   EXIST::FUNCTION:
 BUF_memdup                              3489   EXIST::FUNCTION:
-BN_GF2m_mod_mul                         3490   EXIST::FUNCTION:
+BN_GF2m_mod_mul                         3490   EXIST::FUNCTION:EC2M
 STORE_meth_get_list_next_fn             3491   NOEXIST::FUNCTION:
 STORE_method_get_list_next_function     3491   NOEXIST::FUNCTION:
 STORE_ATTR_INFO_get0_dn                 3492   NOEXIST::FUNCTION:
@@ -3072,7 +3072,7 @@ STORE_ATTR_INFO_free                    3496      NOEXIST::FUNCTION:
 STORE_get_private_key                   3497   NOEXIST::FUNCTION:
 EVP_PKEY_get_attr_count                 3498   EXIST::FUNCTION:
 STORE_ATTR_INFO_new                     3499   NOEXIST::FUNCTION:
-EC_GROUP_get_curve_GF2m                 3500   EXIST::FUNCTION:EC
+EC_GROUP_get_curve_GF2m                 3500   EXIST::FUNCTION:EC,EC2M
 STORE_meth_set_revoke_fn                3501   NOEXIST::FUNCTION:
 STORE_method_set_revoke_function        3501   NOEXIST::FUNCTION:
 STORE_store_number                      3502   NOEXIST::FUNCTION:
@@ -3088,7 +3088,7 @@ BIO_dump_indent_fp                      3511      EXIST::FUNCTION:FP_API
 EC_KEY_set_group                        3512   EXIST::FUNCTION:EC
 BUF_strndup                             3513   EXIST::FUNCTION:
 STORE_list_certificate_start            3514   NOEXIST::FUNCTION:
-BN_GF2m_mod                             3515   EXIST::FUNCTION:
+BN_GF2m_mod                             3515   EXIST::FUNCTION:EC2M
 X509_REQ_check_private_key              3516   EXIST::FUNCTION:
 EC_GROUP_get_seed_len                   3517   EXIST::FUNCTION:EC
 ERR_load_STORE_strings                  3518   NOEXIST::FUNCTION:
@@ -3117,19 +3117,19 @@ STORE_method_set_get_function           3536    NOEXIST::FUNCTION:
 STORE_modify_number                     3537   NOEXIST::FUNCTION:
 STORE_method_get_store_function         3538   NOEXIST::FUNCTION:
 STORE_store_private_key                 3539   NOEXIST::FUNCTION:
-BN_GF2m_mod_sqr_arr                     3540   EXIST::FUNCTION:
+BN_GF2m_mod_sqr_arr                     3540   EXIST::FUNCTION:EC2M
 RSA_setup_blinding                      3541   EXIST::FUNCTION:RSA
 BIO_s_datagram                          3542   EXIST::FUNCTION:DGRAM
 STORE_Memory                            3543   NOEXIST::FUNCTION:
 sk_find_ex                              3544   EXIST::FUNCTION:
-EC_GROUP_set_curve_GF2m                 3545   EXIST::FUNCTION:EC
+EC_GROUP_set_curve_GF2m                 3545   EXIST::FUNCTION:EC,EC2M
 ENGINE_set_default_ECDSA                3546   EXIST::FUNCTION:ENGINE
 POLICY_CONSTRAINTS_new                  3547   EXIST::FUNCTION:
-BN_GF2m_mod_sqrt                        3548   EXIST::FUNCTION:
+BN_GF2m_mod_sqrt                        3548   EXIST::FUNCTION:EC2M
 ECDH_set_default_method                 3549   EXIST::FUNCTION:ECDH
 EC_KEY_generate_key                     3550   EXIST::FUNCTION:EC
 SHA384_Update                           3551   EXIST:!VMSVAX:FUNCTION:SHA,SHA512
-BN_GF2m_arr2poly                        3552   EXIST::FUNCTION:
+BN_GF2m_arr2poly                        3552   EXIST::FUNCTION:EC2M
 STORE_method_get_get_function           3553   NOEXIST::FUNCTION:
 STORE_meth_set_cleanup_fn               3554   NOEXIST::FUNCTION:
 STORE_method_set_cleanup_function       3554   NOEXIST::FUNCTION:
@@ -3154,7 +3154,7 @@ EC_GROUP_get_degree                     3570      EXIST::FUNCTION:EC
 ASN1_generate_v3                        3571   EXIST::FUNCTION:
 STORE_ATTR_INFO_modify_cstr             3572   NOEXIST::FUNCTION:
 X509_policy_tree_level_count            3573   EXIST::FUNCTION:
-BN_GF2m_add                             3574   EXIST::FUNCTION:
+BN_GF2m_add                             3574   EXIST::FUNCTION:EC2M
 EC_KEY_get0_group                       3575   EXIST::FUNCTION:EC
 STORE_generate_crl                      3576   NOEXIST::FUNCTION:
 STORE_store_public_key                  3577   NOEXIST::FUNCTION:
@@ -3179,8 +3179,8 @@ STORE_store_certificate                 3593      NOEXIST::FUNCTION:
 OBJ_bsearch_ex                          3594   NOEXIST::FUNCTION:
 X509_STORE_CTX_set_default              3595   EXIST::FUNCTION:
 STORE_ATTR_INFO_set_sha1str             3596   NOEXIST::FUNCTION:
-BN_GF2m_mod_inv                         3597   EXIST::FUNCTION:
-BN_GF2m_mod_exp                         3598   EXIST::FUNCTION:
+BN_GF2m_mod_inv                         3597   EXIST::FUNCTION:EC2M
+BN_GF2m_mod_exp                         3598   EXIST::FUNCTION:EC2M
 STORE_modify_public_key                 3599   NOEXIST::FUNCTION:
 STORE_meth_get_list_start_fn            3600   NOEXIST::FUNCTION:
 STORE_method_get_list_start_function    3600   NOEXIST::FUNCTION:
@@ -3188,7 +3188,7 @@ EC_GROUP_get0_seed                      3601      EXIST::FUNCTION:EC
 STORE_store_arbitrary                   3602   NOEXIST::FUNCTION:
 STORE_meth_set_unlock_store_fn          3603   NOEXIST::FUNCTION:
 STORE_method_set_unlock_store_function  3603   NOEXIST::FUNCTION:
-BN_GF2m_mod_div_arr                     3604   EXIST::FUNCTION:
+BN_GF2m_mod_div_arr                     3604   EXIST::FUNCTION:EC2M
 ENGINE_set_ECDSA                        3605   EXIST::FUNCTION:ENGINE
 STORE_create_method                     3606   NOEXIST::FUNCTION:
 ECPKParameters_print                    3607   EXIST::FUNCTION:BIO,EC
@@ -3211,8 +3211,8 @@ EC_KEY_get_enc_flags                    3622      EXIST::FUNCTION:EC
 ASN1_const_check_infinite_end           3623   EXIST::FUNCTION:
 EVP_PKEY_delete_attr                    3624   EXIST::FUNCTION:
 ECDSA_set_default_method                3625   EXIST::FUNCTION:ECDSA
-EC_POINT_set_compressed_coordinates_GF2m 3626  EXIST:!VMS:FUNCTION:EC
-EC_POINT_set_compr_coords_GF2m          3626   EXIST:VMS:FUNCTION:EC
+EC_POINT_set_compressed_coordinates_GF2m 3626  EXIST:!VMS:FUNCTION:EC,EC2M
+EC_POINT_set_compr_coords_GF2m          3626   EXIST:VMS:FUNCTION:EC,EC2M
 EC_GROUP_cmp                            3627   EXIST::FUNCTION:EC
 STORE_revoke_certificate                3628   NOEXIST::FUNCTION:
 BN_get0_nist_prime_256                  3629   EXIST::FUNCTION:
@@ -3241,7 +3241,7 @@ POLICY_CONSTRAINTS_it                   3649      EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTI
 STORE_get_ex_new_index                  3650   NOEXIST::FUNCTION:
 EVP_PKEY_get_attr_by_OBJ                3651   EXIST::FUNCTION:
 X509_VERIFY_PARAM_add0_policy           3652   EXIST::FUNCTION:
-BN_GF2m_mod_solve_quad                  3653   EXIST::FUNCTION:
+BN_GF2m_mod_solve_quad                  3653   EXIST::FUNCTION:EC2M
 SHA256                                  3654   EXIST::FUNCTION:SHA,SHA256
 i2d_ECPrivateKey_fp                     3655   EXIST::FUNCTION:EC,FP_API
 X509_policy_tree_get0_user_policies     3656   EXIST:!VMS:FUNCTION:
@@ -3249,8 +3249,8 @@ X509_pcy_tree_get0_usr_policies         3656      EXIST:VMS:FUNCTION:
 OPENSSL_DIR_read                        3657   EXIST::FUNCTION:
 ENGINE_register_all_ECDSA               3658   EXIST::FUNCTION:ENGINE
 X509_VERIFY_PARAM_lookup                3659   EXIST::FUNCTION:
-EC_POINT_get_affine_coordinates_GF2m    3660   EXIST:!VMS:FUNCTION:EC
-EC_POINT_get_affine_coords_GF2m         3660   EXIST:VMS:FUNCTION:EC
+EC_POINT_get_affine_coordinates_GF2m    3660   EXIST:!VMS:FUNCTION:EC,EC2M
+EC_POINT_get_affine_coords_GF2m         3660   EXIST:VMS:FUNCTION:EC,EC2M
 EC_GROUP_dup                            3661   EXIST::FUNCTION:EC
 ENGINE_get_default_ECDSA                3662   EXIST::FUNCTION:ENGINE
 EC_KEY_new                              3663   EXIST::FUNCTION:EC
@@ -3332,7 +3332,7 @@ STORE_list_certificate_end              3734      NOEXIST::FUNCTION:
 STORE_get_crl                           3735   NOEXIST::FUNCTION:
 X509_POLICY_NODE_print                  3736   EXIST::FUNCTION:
 SHA384_Init                             3737   EXIST:!VMSVAX:FUNCTION:SHA,SHA512
-EC_GF2m_simple_method                   3738   EXIST::FUNCTION:EC
+EC_GF2m_simple_method                   3738   EXIST::FUNCTION:EC,EC2M
 ECDSA_set_ex_data                       3739   EXIST::FUNCTION:ECDSA
 SHA384_Final                            3740   EXIST:!VMSVAX:FUNCTION:SHA,SHA512
 PKCS7_set_digest                        3741   EXIST::FUNCTION:
@@ -3364,7 +3364,7 @@ BIO_dump_cb                             3764      EXIST::FUNCTION:
 SHA256_Update                           3765   EXIST::FUNCTION:SHA,SHA256
 pqueue_insert                           3766   EXIST::FUNCTION:
 pitem_free                              3767   EXIST::FUNCTION:
-BN_GF2m_mod_inv_arr                     3768   EXIST::FUNCTION:
+BN_GF2m_mod_inv_arr                     3768   EXIST::FUNCTION:EC2M
 ENGINE_unregister_ECDSA                 3769   EXIST::FUNCTION:ENGINE
 BN_BLINDING_set_thread_id               3770   EXIST::FUNCTION:DEPRECATED
 get_rfc3526_prime_8192                  3771   EXIST::FUNCTION:
index b01acf2bbe101c2d019efe9985d453f9a9cd7f3a..24898a4227d0611d3f17c8144e81a74ac82e7f3a 100755 (executable)
@@ -284,6 +284,7 @@ $cflags.=" -DOPENSSL_NO_ENGINE"   if $no_engine;
 $cflags.=" -DOPENSSL_NO_HW"   if $no_hw;
 $cflags.=" -DOPENSSL_FIPS"    if $fips;
 $cflags.=" -DOPENSSL_NO_JPAKE"    if $no_jpake;
+$cflags.=" -DOPENSSL_NO_EC2M"    if $no_ec2m;
 $cflags.= " -DZLIB" if $zlib_opt;
 $cflags.= " -DZLIB_SHARED" if $zlib_opt == 2;
 
@@ -1299,6 +1300,7 @@ sub read_options
                "no-tlsext" => \$no_tlsext,
                "no-cms" => \$no_cms,
                "no-jpake" => \$no_jpake,
+               "no-ec2m" => \$no_ec2m,
                "no-err" => \$no_err,
                "no-sock" => \$no_sock,
                "no-krb5" => \$no_krb5,
index 681c2bb776bfd142af28d5e78caaccca242cef80..3ccd542f695773354c1ba688c96fe7535849e8fc 100755 (executable)
@@ -84,7 +84,7 @@ my @known_ossl_platforms = ( "VMS", "WIN16", "WIN32", "WINNT", "OS2" );
 my @known_algorithms = ( "RC2", "RC4", "RC5", "IDEA", "DES", "BF",
                         "CAST", "MD2", "MD4", "MD5", "SHA", "SHA0", "SHA1",
                         "SHA256", "SHA512", "RIPEMD",
-                        "MDC2", "WHIRLPOOL", "RSA", "DSA", "DH", "EC", "ECDH", "ECDSA",
+                        "MDC2", "WHIRLPOOL", "RSA", "DSA", "DH", "EC", "ECDH", "ECDSA", "EC2M",
                         "HMAC", "AES", "CAMELLIA", "SEED", "GOST",
                         # Envelope "algorithms"
                         "EVP", "X509", "ASN1_TYPEDEFS",
@@ -107,6 +107,8 @@ my @known_algorithms = ( "RC2", "RC4", "RC5", "IDEA", "DES", "BF",
                         "SSL2",
                         # JPAKE
                         "JPAKE",
+                        # NEXTPROTONEG
+                        "NEXTPROTONEG",
                         # Deprecated functions
                         "DEPRECATED" );
 
@@ -127,7 +129,7 @@ my $no_rsa; my $no_dsa; my $no_dh; my $no_hmac=0; my $no_aes; my $no_krb5;
 my $no_ec; my $no_ecdsa; my $no_ecdh; my $no_engine; my $no_hw;
 my $no_fp_api; my $no_static_engine=1; my $no_gmp; my $no_deprecated;
 my $no_rfc3779; my $no_psk; my $no_tlsext; my $no_cms; my $no_capieng;
-my $no_jpake; my $no_ssl2;
+my $no_jpake; my $no_ssl2; my $no_ec2m; my $no_nextprotoneg;
 
 my $fips;
 
@@ -218,6 +220,8 @@ foreach (@ARGV, split(/ /, $options))
        elsif (/^no-rfc3779$/)  { $no_rfc3779=1; }
        elsif (/^no-tlsext$/)   { $no_tlsext=1; }
        elsif (/^no-cms$/)      { $no_cms=1; }
+       elsif (/^no-ec2m$/)     { $no_ec2m=1; }
+       elsif (/^no-nextprotoneg$/)     { $no_nextprotoneg=1; }
        elsif (/^no-ssl2$/)     { $no_ssl2=1; }
        elsif (/^no-capieng$/)  { $no_capieng=1; }
        elsif (/^no-jpake$/)    { $no_jpake=1; }
@@ -1171,6 +1175,8 @@ sub is_valid
                        if ($keyword eq "TLSEXT" && $no_tlsext) { return 0; }
                        if ($keyword eq "PSK" && $no_psk) { return 0; }
                        if ($keyword eq "CMS" && $no_cms) { return 0; }
+                       if ($keyword eq "EC2M" && $no_ec2m) { return 0; }
+                       if ($keyword eq "NEXTPROTONEG" && $no_nextprotoneg) { return 0; }
                        if ($keyword eq "SSL2" && $no_ssl2) { return 0; }
                        if ($keyword eq "CAPIENG" && $no_capieng) { return 0; }
                        if ($keyword eq "JPAKE" && $no_jpake) { return 0; }