15572ea348c8e7bbd737371cbc21073dc6e5c491
[openssl.git] / crypto / cms / cms_err.c
1 /* crypto/cms/cms_err.c */
2 /* ====================================================================
3  * Copyright (c) 1999-2013 The OpenSSL Project.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  *
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in
14  *    the documentation and/or other materials provided with the
15  *    distribution.
16  *
17  * 3. All advertising materials mentioning features or use of this
18  *    software must display the following acknowledgment:
19  *    "This product includes software developed by the OpenSSL Project
20  *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
21  *
22  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
23  *    endorse or promote products derived from this software without
24  *    prior written permission. For written permission, please contact
25  *    openssl-core@OpenSSL.org.
26  *
27  * 5. Products derived from this software may not be called "OpenSSL"
28  *    nor may "OpenSSL" appear in their names without prior written
29  *    permission of the OpenSSL Project.
30  *
31  * 6. Redistributions of any form whatsoever must retain the following
32  *    acknowledgment:
33  *    "This product includes software developed by the OpenSSL Project
34  *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
35  *
36  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
37  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
38  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
39  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
40  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
42  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
43  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
44  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
45  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
46  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
47  * OF THE POSSIBILITY OF SUCH DAMAGE.
48  * ====================================================================
49  *
50  * This product includes cryptographic software written by Eric Young
51  * (eay@cryptsoft.com).  This product includes software written by Tim
52  * Hudson (tjh@cryptsoft.com).
53  *
54  */
55
56 /*
57  * NOTE: this file was auto generated by the mkerr.pl script: any changes
58  * made to it will be overwritten when the script next updates this file,
59  * only reason strings will be preserved.
60  */
61
62 #include <stdio.h>
63 #include <openssl/err.h>
64 #include <openssl/cms.h>
65
66 /* BEGIN ERROR CODES */
67 #ifndef OPENSSL_NO_ERR
68
69 # define ERR_FUNC(func) ERR_PACK(ERR_LIB_CMS,func,0)
70 # define ERR_REASON(reason) ERR_PACK(ERR_LIB_CMS,0,reason)
71
72 static ERR_STRING_DATA CMS_str_functs[] = {
73     {ERR_FUNC(CMS_F_CHECK_CONTENT), "CHECK_CONTENT"},
74     {ERR_FUNC(CMS_F_CMS_ADD0_CERT), "CMS_add0_cert"},
75     {ERR_FUNC(CMS_F_CMS_ADD0_RECIPIENT_KEY), "CMS_add0_recipient_key"},
76     {ERR_FUNC(CMS_F_CMS_ADD0_RECIPIENT_PASSWORD),
77      "CMS_add0_recipient_password"},
78     {ERR_FUNC(CMS_F_CMS_ADD1_RECEIPTREQUEST), "CMS_add1_ReceiptRequest"},
79     {ERR_FUNC(CMS_F_CMS_ADD1_RECIPIENT_CERT), "CMS_add1_recipient_cert"},
80     {ERR_FUNC(CMS_F_CMS_ADD1_SIGNER), "CMS_add1_signer"},
81     {ERR_FUNC(CMS_F_CMS_ADD1_SIGNINGTIME), "CMS_ADD1_SIGNINGTIME"},
82     {ERR_FUNC(CMS_F_CMS_COMPRESS), "CMS_compress"},
83     {ERR_FUNC(CMS_F_CMS_COMPRESSEDDATA_CREATE), "cms_CompressedData_create"},
84     {ERR_FUNC(CMS_F_CMS_COMPRESSEDDATA_INIT_BIO),
85      "cms_CompressedData_init_bio"},
86     {ERR_FUNC(CMS_F_CMS_COPY_CONTENT), "CMS_COPY_CONTENT"},
87     {ERR_FUNC(CMS_F_CMS_COPY_MESSAGEDIGEST), "CMS_COPY_MESSAGEDIGEST"},
88     {ERR_FUNC(CMS_F_CMS_DATA), "CMS_data"},
89     {ERR_FUNC(CMS_F_CMS_DATAFINAL), "CMS_dataFinal"},
90     {ERR_FUNC(CMS_F_CMS_DATAINIT), "CMS_dataInit"},
91     {ERR_FUNC(CMS_F_CMS_DECRYPT), "CMS_decrypt"},
92     {ERR_FUNC(CMS_F_CMS_DECRYPT_SET1_KEY), "CMS_decrypt_set1_key"},
93     {ERR_FUNC(CMS_F_CMS_DECRYPT_SET1_PASSWORD), "CMS_decrypt_set1_password"},
94     {ERR_FUNC(CMS_F_CMS_DECRYPT_SET1_PKEY), "CMS_decrypt_set1_pkey"},
95     {ERR_FUNC(CMS_F_CMS_DIGESTALGORITHM_FIND_CTX),
96      "cms_DigestAlgorithm_find_ctx"},
97     {ERR_FUNC(CMS_F_CMS_DIGESTALGORITHM_INIT_BIO),
98      "cms_DigestAlgorithm_init_bio"},
99     {ERR_FUNC(CMS_F_CMS_DIGESTEDDATA_DO_FINAL), "cms_DigestedData_do_final"},
100     {ERR_FUNC(CMS_F_CMS_DIGEST_VERIFY), "CMS_digest_verify"},
101     {ERR_FUNC(CMS_F_CMS_ENCODE_RECEIPT), "cms_encode_Receipt"},
102     {ERR_FUNC(CMS_F_CMS_ENCRYPT), "CMS_encrypt"},
103     {ERR_FUNC(CMS_F_CMS_ENCRYPTEDCONTENT_INIT_BIO),
104      "cms_EncryptedContent_init_bio"},
105     {ERR_FUNC(CMS_F_CMS_ENCRYPTEDDATA_DECRYPT), "CMS_EncryptedData_decrypt"},
106     {ERR_FUNC(CMS_F_CMS_ENCRYPTEDDATA_ENCRYPT), "CMS_EncryptedData_encrypt"},
107     {ERR_FUNC(CMS_F_CMS_ENCRYPTEDDATA_SET1_KEY),
108      "CMS_EncryptedData_set1_key"},
109     {ERR_FUNC(CMS_F_CMS_ENVELOPEDDATA_CREATE), "CMS_EnvelopedData_create"},
110     {ERR_FUNC(CMS_F_CMS_ENVELOPEDDATA_INIT_BIO),
111      "cms_EnvelopedData_init_bio"},
112     {ERR_FUNC(CMS_F_CMS_ENVELOPED_DATA_INIT), "CMS_ENVELOPED_DATA_INIT"},
113     {ERR_FUNC(CMS_F_CMS_ENV_ASN1_CTRL), "cms_env_asn1_ctrl"},
114     {ERR_FUNC(CMS_F_CMS_FINAL), "CMS_final"},
115     {ERR_FUNC(CMS_F_CMS_GET0_CERTIFICATE_CHOICES),
116      "CMS_GET0_CERTIFICATE_CHOICES"},
117     {ERR_FUNC(CMS_F_CMS_GET0_CONTENT), "CMS_get0_content"},
118     {ERR_FUNC(CMS_F_CMS_GET0_ECONTENT_TYPE), "CMS_GET0_ECONTENT_TYPE"},
119     {ERR_FUNC(CMS_F_CMS_GET0_ENVELOPED), "cms_get0_enveloped"},
120     {ERR_FUNC(CMS_F_CMS_GET0_REVOCATION_CHOICES),
121      "CMS_GET0_REVOCATION_CHOICES"},
122     {ERR_FUNC(CMS_F_CMS_GET0_SIGNED), "CMS_GET0_SIGNED"},
123     {ERR_FUNC(CMS_F_CMS_MSGSIGDIGEST_ADD1), "cms_msgSigDigest_add1"},
124     {ERR_FUNC(CMS_F_CMS_RECEIPTREQUEST_CREATE0),
125      "CMS_ReceiptRequest_create0"},
126     {ERR_FUNC(CMS_F_CMS_RECEIPT_VERIFY), "cms_Receipt_verify"},
127     {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_DECRYPT), "CMS_RecipientInfo_decrypt"},
128     {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_ENCRYPT), "CMS_RecipientInfo_encrypt"},
129     {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_KARI_ENCRYPT),
130      "cms_RecipientInfo_kari_encrypt"},
131     {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_KARI_GET0_ALG),
132      "CMS_RecipientInfo_kari_get0_alg"},
133     {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_KARI_GET0_ORIG_ID),
134      "CMS_RecipientInfo_kari_get0_orig_id"},
135     {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_KARI_GET0_REKS),
136      "CMS_RecipientInfo_kari_get0_reks"},
137     {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_KARI_ORIG_ID_CMP),
138      "CMS_RecipientInfo_kari_orig_id_cmp"},
139     {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_KEKRI_DECRYPT),
140      "CMS_RECIPIENTINFO_KEKRI_DECRYPT"},
141     {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_KEKRI_ENCRYPT),
142      "CMS_RECIPIENTINFO_KEKRI_ENCRYPT"},
143     {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_KEKRI_GET0_ID),
144      "CMS_RecipientInfo_kekri_get0_id"},
145     {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_KEKRI_ID_CMP),
146      "CMS_RecipientInfo_kekri_id_cmp"},
147     {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_KTRI_CERT_CMP),
148      "CMS_RecipientInfo_ktri_cert_cmp"},
149     {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_KTRI_DECRYPT),
150      "CMS_RECIPIENTINFO_KTRI_DECRYPT"},
151     {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_KTRI_ENCRYPT),
152      "CMS_RECIPIENTINFO_KTRI_ENCRYPT"},
153     {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_KTRI_GET0_ALGS),
154      "CMS_RecipientInfo_ktri_get0_algs"},
155     {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_KTRI_GET0_SIGNER_ID),
156      "CMS_RecipientInfo_ktri_get0_signer_id"},
157     {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_PWRI_CRYPT),
158      "cms_RecipientInfo_pwri_crypt"},
159     {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_SET0_KEY),
160      "CMS_RecipientInfo_set0_key"},
161     {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_SET0_PASSWORD),
162      "CMS_RecipientInfo_set0_password"},
163     {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_SET0_PKEY),
164      "CMS_RecipientInfo_set0_pkey"},
165     {ERR_FUNC(CMS_F_CMS_SD_ASN1_CTRL), "CMS_SD_ASN1_CTRL"},
166     {ERR_FUNC(CMS_F_CMS_SET1_IAS), "cms_set1_ias"},
167     {ERR_FUNC(CMS_F_CMS_SET1_KEYID), "cms_set1_keyid"},
168     {ERR_FUNC(CMS_F_CMS_SET1_SIGNERIDENTIFIER), "cms_set1_SignerIdentifier"},
169     {ERR_FUNC(CMS_F_CMS_SET_DETACHED), "CMS_set_detached"},
170     {ERR_FUNC(CMS_F_CMS_SIGN), "CMS_sign"},
171     {ERR_FUNC(CMS_F_CMS_SIGNED_DATA_INIT), "CMS_SIGNED_DATA_INIT"},
172     {ERR_FUNC(CMS_F_CMS_SIGNERINFO_CONTENT_SIGN),
173      "CMS_SIGNERINFO_CONTENT_SIGN"},
174     {ERR_FUNC(CMS_F_CMS_SIGNERINFO_SIGN), "CMS_SignerInfo_sign"},
175     {ERR_FUNC(CMS_F_CMS_SIGNERINFO_VERIFY), "CMS_SignerInfo_verify"},
176     {ERR_FUNC(CMS_F_CMS_SIGNERINFO_VERIFY_CERT),
177      "CMS_SIGNERINFO_VERIFY_CERT"},
178     {ERR_FUNC(CMS_F_CMS_SIGNERINFO_VERIFY_CONTENT),
179      "CMS_SignerInfo_verify_content"},
180     {ERR_FUNC(CMS_F_CMS_SIGN_RECEIPT), "CMS_sign_receipt"},
181     {ERR_FUNC(CMS_F_CMS_STREAM), "CMS_stream"},
182     {ERR_FUNC(CMS_F_CMS_UNCOMPRESS), "CMS_uncompress"},
183     {ERR_FUNC(CMS_F_CMS_VERIFY), "CMS_verify"},
184     {0, NULL}
185 };
186
187 static ERR_STRING_DATA CMS_str_reasons[] = {
188     {ERR_REASON(CMS_R_ADD_SIGNER_ERROR), "add signer error"},
189     {ERR_REASON(CMS_R_CERTIFICATE_ALREADY_PRESENT),
190      "certificate already present"},
191     {ERR_REASON(CMS_R_CERTIFICATE_HAS_NO_KEYID), "certificate has no keyid"},
192     {ERR_REASON(CMS_R_CERTIFICATE_VERIFY_ERROR), "certificate verify error"},
193     {ERR_REASON(CMS_R_CIPHER_INITIALISATION_ERROR),
194      "cipher initialisation error"},
195     {ERR_REASON(CMS_R_CIPHER_PARAMETER_INITIALISATION_ERROR),
196      "cipher parameter initialisation error"},
197     {ERR_REASON(CMS_R_CMS_DATAFINAL_ERROR), "cms datafinal error"},
198     {ERR_REASON(CMS_R_CMS_LIB), "cms lib"},
199     {ERR_REASON(CMS_R_CONTENTIDENTIFIER_MISMATCH),
200      "contentidentifier mismatch"},
201     {ERR_REASON(CMS_R_CONTENT_NOT_FOUND), "content not found"},
202     {ERR_REASON(CMS_R_CONTENT_TYPE_MISMATCH), "content type mismatch"},
203     {ERR_REASON(CMS_R_CONTENT_TYPE_NOT_COMPRESSED_DATA),
204      "content type not compressed data"},
205     {ERR_REASON(CMS_R_CONTENT_TYPE_NOT_ENVELOPED_DATA),
206      "content type not enveloped data"},
207     {ERR_REASON(CMS_R_CONTENT_TYPE_NOT_SIGNED_DATA),
208      "content type not signed data"},
209     {ERR_REASON(CMS_R_CONTENT_VERIFY_ERROR), "content verify error"},
210     {ERR_REASON(CMS_R_CTRL_ERROR), "ctrl error"},
211     {ERR_REASON(CMS_R_CTRL_FAILURE), "ctrl failure"},
212     {ERR_REASON(CMS_R_DECRYPT_ERROR), "decrypt error"},
213     {ERR_REASON(CMS_R_DIGEST_ERROR), "digest error"},
214     {ERR_REASON(CMS_R_ERROR_GETTING_PUBLIC_KEY), "error getting public key"},
215     {ERR_REASON(CMS_R_ERROR_READING_MESSAGEDIGEST_ATTRIBUTE),
216      "error reading messagedigest attribute"},
217     {ERR_REASON(CMS_R_ERROR_SETTING_KEY), "error setting key"},
218     {ERR_REASON(CMS_R_ERROR_SETTING_RECIPIENTINFO),
219      "error setting recipientinfo"},
220     {ERR_REASON(CMS_R_INVALID_ENCRYPTED_KEY_LENGTH),
221      "invalid encrypted key length"},
222     {ERR_REASON(CMS_R_INVALID_KEY_ENCRYPTION_PARAMETER),
223      "invalid key encryption parameter"},
224     {ERR_REASON(CMS_R_INVALID_KEY_LENGTH), "invalid key length"},
225     {ERR_REASON(CMS_R_MD_BIO_INIT_ERROR), "md bio init error"},
226     {ERR_REASON(CMS_R_MESSAGEDIGEST_ATTRIBUTE_WRONG_LENGTH),
227      "messagedigest attribute wrong length"},
228     {ERR_REASON(CMS_R_MESSAGEDIGEST_WRONG_LENGTH),
229      "messagedigest wrong length"},
230     {ERR_REASON(CMS_R_MSGSIGDIGEST_ERROR), "msgsigdigest error"},
231     {ERR_REASON(CMS_R_MSGSIGDIGEST_VERIFICATION_FAILURE),
232      "msgsigdigest verification failure"},
233     {ERR_REASON(CMS_R_MSGSIGDIGEST_WRONG_LENGTH),
234      "msgsigdigest wrong length"},
235     {ERR_REASON(CMS_R_NEED_ONE_SIGNER), "need one signer"},
236     {ERR_REASON(CMS_R_NOT_A_SIGNED_RECEIPT), "not a signed receipt"},
237     {ERR_REASON(CMS_R_NOT_ENCRYPTED_DATA), "not encrypted data"},
238     {ERR_REASON(CMS_R_NOT_KEK), "not kek"},
239     {ERR_REASON(CMS_R_NOT_KEY_AGREEMENT), "not key agreement"},
240     {ERR_REASON(CMS_R_NOT_KEY_TRANSPORT), "not key transport"},
241     {ERR_REASON(CMS_R_NOT_PWRI), "not pwri"},
242     {ERR_REASON(CMS_R_NOT_SUPPORTED_FOR_THIS_KEY_TYPE),
243      "not supported for this key type"},
244     {ERR_REASON(CMS_R_NO_CIPHER), "no cipher"},
245     {ERR_REASON(CMS_R_NO_CONTENT), "no content"},
246     {ERR_REASON(CMS_R_NO_CONTENT_TYPE), "no content type"},
247     {ERR_REASON(CMS_R_NO_DEFAULT_DIGEST), "no default digest"},
248     {ERR_REASON(CMS_R_NO_DIGEST_SET), "no digest set"},
249     {ERR_REASON(CMS_R_NO_KEY), "no key"},
250     {ERR_REASON(CMS_R_NO_KEY_OR_CERT), "no key or cert"},
251     {ERR_REASON(CMS_R_NO_MATCHING_DIGEST), "no matching digest"},
252     {ERR_REASON(CMS_R_NO_MATCHING_RECIPIENT), "no matching recipient"},
253     {ERR_REASON(CMS_R_NO_MATCHING_SIGNATURE), "no matching signature"},
254     {ERR_REASON(CMS_R_NO_MSGSIGDIGEST), "no msgsigdigest"},
255     {ERR_REASON(CMS_R_NO_PASSWORD), "no password"},
256     {ERR_REASON(CMS_R_NO_PRIVATE_KEY), "no private key"},
257     {ERR_REASON(CMS_R_NO_PUBLIC_KEY), "no public key"},
258     {ERR_REASON(CMS_R_NO_RECEIPT_REQUEST), "no receipt request"},
259     {ERR_REASON(CMS_R_NO_SIGNERS), "no signers"},
260     {ERR_REASON(CMS_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE),
261      "private key does not match certificate"},
262     {ERR_REASON(CMS_R_RECEIPT_DECODE_ERROR), "receipt decode error"},
263     {ERR_REASON(CMS_R_RECIPIENT_ERROR), "recipient error"},
264     {ERR_REASON(CMS_R_SIGNER_CERTIFICATE_NOT_FOUND),
265      "signer certificate not found"},
266     {ERR_REASON(CMS_R_SIGNFINAL_ERROR), "signfinal error"},
267     {ERR_REASON(CMS_R_SMIME_TEXT_ERROR), "smime text error"},
268     {ERR_REASON(CMS_R_STORE_INIT_ERROR), "store init error"},
269     {ERR_REASON(CMS_R_TYPE_NOT_COMPRESSED_DATA), "type not compressed data"},
270     {ERR_REASON(CMS_R_TYPE_NOT_DATA), "type not data"},
271     {ERR_REASON(CMS_R_TYPE_NOT_DIGESTED_DATA), "type not digested data"},
272     {ERR_REASON(CMS_R_TYPE_NOT_ENCRYPTED_DATA), "type not encrypted data"},
273     {ERR_REASON(CMS_R_TYPE_NOT_ENVELOPED_DATA), "type not enveloped data"},
274     {ERR_REASON(CMS_R_UNABLE_TO_FINALIZE_CONTEXT),
275      "unable to finalize context"},
276     {ERR_REASON(CMS_R_UNKNOWN_CIPHER), "unknown cipher"},
277     {ERR_REASON(CMS_R_UNKNOWN_DIGEST_ALGORIHM), "unknown digest algorihm"},
278     {ERR_REASON(CMS_R_UNKNOWN_ID), "unknown id"},
279     {ERR_REASON(CMS_R_UNSUPPORTED_COMPRESSION_ALGORITHM),
280      "unsupported compression algorithm"},
281     {ERR_REASON(CMS_R_UNSUPPORTED_CONTENT_TYPE), "unsupported content type"},
282     {ERR_REASON(CMS_R_UNSUPPORTED_KEK_ALGORITHM),
283      "unsupported kek algorithm"},
284     {ERR_REASON(CMS_R_UNSUPPORTED_KEY_ENCRYPTION_ALGORITHM),
285      "unsupported key encryption algorithm"},
286     {ERR_REASON(CMS_R_UNSUPPORTED_RECIPIENT_TYPE),
287      "unsupported recipient type"},
288     {ERR_REASON(CMS_R_UNSUPPORTED_RECPIENTINFO_TYPE),
289      "unsupported recpientinfo type"},
290     {ERR_REASON(CMS_R_UNSUPPORTED_TYPE), "unsupported type"},
291     {ERR_REASON(CMS_R_UNWRAP_ERROR), "unwrap error"},
292     {ERR_REASON(CMS_R_UNWRAP_FAILURE), "unwrap failure"},
293     {ERR_REASON(CMS_R_VERIFICATION_FAILURE), "verification failure"},
294     {ERR_REASON(CMS_R_WRAP_ERROR), "wrap error"},
295     {0, NULL}
296 };
297
298 #endif
299
300 void ERR_load_CMS_strings(void)
301 {
302 #ifndef OPENSSL_NO_ERR
303
304     if (ERR_func_error_string(CMS_str_functs[0].error) == NULL) {
305         ERR_load_strings(0, CMS_str_functs);
306         ERR_load_strings(0, CMS_str_reasons);
307     }
308 #endif
309 }