]> git.lyx.org Git - features.git/blob - src/frontends/gtk/Dialogs.C
Add gtk Texinfo dialog
[features.git] / src / frontends / gtk / Dialogs.C
1 /**
2  * \file xforms/Dialogs.C
3  * This file is part of LyX, the document processor.
4  * Licence details can be found in the file COPYING.
5  *
6  * \author Angus Leeming
7  *
8  * Full author contact details are available in file CREDITS.
9  */
10
11 #include <config.h>
12
13 #include "Dialogs.h"
14 #include "Dialog.h"
15
16 #include "Tooltips.h"
17
18 #include "ControlAboutlyx.h"
19 #include "ControlBibtex.h"
20 #include "ControlBox.h"
21 #include "ControlBranch.h"
22 #include "ControlChanges.h"
23 #include "ControlCharacter.h"
24 #include "ControlCitation.h"
25 #include "ControlCommand.h"
26 #include "ControlDocument.h"
27 #include "ControlErrorList.h"
28 #include "ControlERT.h"
29 #include "ControlExternal.h"
30 #include "ControlFloat.h"
31 #include "ControlGraphics.h"
32 #include "ControlInclude.h"
33 #include "ControlLog.h"
34 #include "ControlMath.h"
35 #include "ControlNote.h"
36 #include "ControlParagraph.h"
37 #include "ControlPreamble.h"
38 #include "ControlPrefs.h"
39 #include "ControlPrint.h"
40 #include "ControlRef.h"
41 #include "ControlSearch.h"
42 #include "ControlSendto.h"
43 #include "ControlShowFile.h"
44 #include "ControlSpellchecker.h"
45 #include "ControlTabular.h"
46 #include "ControlTabularCreate.h"
47 #include "ControlTexinfo.h"
48 #include "ControlToc.h"
49 #include "ControlVSpace.h"
50 #include "ControlWrap.h"
51
52 #include "GAboutlyx.h"
53 #include "GText.h"
54 #include "GMathDelim.h"
55 #include "FormBibitem.h"
56 #include "FormBibtex.h"
57 #include "FormBox.h"
58 #include "FormBranch.h"
59 #include "FormChanges.h"
60 #include "GCharacter.h"
61 #include "FormCitation.h"
62 #include "FormDocument.h"
63 #include "GErrorList.h"
64 #include "FormERT.h"
65 #include "FormExternal.h"
66 #include "FormFloat.h"
67 #include "FormGraphics.h"
68 #include "FormInclude.h"
69 #include "FormLog.h"
70 #include "GMathPanel.h"
71 #include "FormMathsBitmap.h"
72 #include "GMathsMatrix.h"
73 #include "FormMathsSpace.h"
74 #include "FormMathsStyle.h"
75 #include "FormNote.h"
76 #include "GParagraph.h"
77 #include "FormPreamble.h"
78 #include "FormPreferences.h"
79 #include "GPrint.h"
80 #include "FormRef.h"
81 #include "GSearch.h"
82 #include "FormSendto.h"
83 #include "FormTabular.h"
84 #include "GTexinfo.h"
85 #include "FormShowFile.h"
86 #include "GSpellchecker.h"
87 #include "GTableCreate.h"
88 #include "GToc.h"
89 #include "GUrl.h"
90 #include "FormVSpace.h"
91 #include "FormWrap.h"
92
93 #ifdef HAVE_LIBAIKSAURUS
94 #include "ControlThesaurus.h"
95 #include "FormThesaurus.h"
96 #endif
97
98 #include "xformsBC.h"
99 #include "ButtonController.h"
100
101 #include "arrows.xbm"
102 #include "bop.xbm"
103 #include "brel.xbm"
104 #include "deco.xbm"
105 #include "dots.xbm"
106 #include "greek.xbm"
107 #include "misc.xbm"
108 #include "varsz.xbm"
109
110 #include "ams_misc.xbm"
111 #include "ams_arrows.xbm"
112 #include "ams_rel.xbm"
113 #include "ams_nrel.xbm"
114 #include "ams_ops.xbm"
115
116 #include <boost/assert.hpp>
117 #include <vector>
118
119 using std::string;
120
121 using namespace lyx::frontend;
122
123 namespace {
124
125 FormMathsBitmap * createFormBitmap(Dialog & parent, string const & title,
126                                    char const * const * data, int size)
127 {
128         char const * const * const end = data + size;
129         return new FormMathsBitmap(parent, title, std::vector<string>(data, end));
130 }
131
132
133 char const * const dialognames[] = {
134 "aboutlyx", "bibitem", "bibtex", "box", "branch", "changes", "character",
135 "citation", "document", "errorlist" , "ert", "external", "file",
136 "findreplace", "float", "graphics", "include", "index", "label", "log",
137 "mathpanel", "mathaccents", "matharrows", "mathoperators", "mathrelations",
138 "mathgreek", "mathmisc", "mathdots", "mathbigoperators", "mathamsmisc",
139 "mathamsarrows", "mathamsrelations", "mathamsnegatedrelations",
140 "mathamsoperators", "mathdelimiter", "mathmatrix", "mathspace", "mathstyle",
141 "note", "paragraph", "preamble", "prefs", "print", "ref", "sendto",
142 "spellchecker", "tabular", "tabularcreate", "texinfo",
143
144 #ifdef HAVE_LIBAIKSAURUS
145 "thesaurus",
146 #endif
147
148 "toc", "url", "vspace", "wrap" };
149
150 char const * const * const end_dialognames =
151         dialognames + (sizeof(dialognames) / sizeof(char *));
152
153 struct cmpCStr {
154         cmpCStr(char const * name) : name_(name) {}
155         bool operator()(char const * other) {
156                 return strcmp(other, name_) == 0;
157         }
158 private:
159         char const * name_;
160 };
161
162 } // namespace anon
163
164
165 bool Dialogs::isValidName(string const & name) const
166 {
167         return std::find_if(dialognames, end_dialognames,
168                             cmpCStr(name.c_str())) != end_dialognames;
169 }
170
171
172 Dialogs::DialogPtr Dialogs::build(string const & name)
173 {
174         BOOST_ASSERT(isValidName(name));
175
176         DialogPtr dialog(new Dialog(lyxview_, name));
177         dialog->bc().view(new xformsBC(dialog->bc()));
178
179         if (name == "aboutlyx") {
180                 dialog->bc().view(new GBC(dialog->bc()));
181                 dialog->setController(new ControlAboutlyx(*dialog));
182                 dialog->setView(new GAboutlyx(*dialog));
183                 dialog->bc().bp(new OkCancelPolicy);
184         } else if (name == "bibitem") {
185                 dialog->setController(new ControlCommand(*dialog, name));
186                 dialog->setView(new FormBibitem(*dialog));
187                 dialog->bc().bp(new OkCancelReadOnlyPolicy);
188         } else if (name == "bibtex") {
189                 dialog->setController(new ControlBibtex(*dialog));
190                 dialog->setView(new FormBibtex(*dialog));
191                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
192         } else if (name == "box") {
193                 dialog->setController(new ControlBox(*dialog));
194                 dialog->setView(new FormBox(*dialog));
195                 dialog->bc().bp(new OkApplyCancelReadOnlyPolicy);
196         } else if (name == "changes") {
197                 dialog->setController(new ControlChanges(*dialog));
198                 dialog->setView(new FormChanges(*dialog));
199                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
200         } else if (name == "character") {
201                 dialog->bc().view(new GBC(dialog->bc()));
202                 dialog->setController(new ControlCharacter(*dialog));
203                 dialog->setView(new GCharacter(*dialog));
204                 dialog->bc().bp(new OkApplyCancelReadOnlyPolicy);
205         } else if (name == "citation") {
206                 dialog->setController(new ControlCitation(*dialog));
207                 dialog->setView(new FormCitation(*dialog));
208                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
209         } else if (name == "document") {
210                 dialog->setController(new ControlDocument(*dialog));
211                 dialog->setView(new FormDocument(*dialog));
212                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
213         } else if (name == "errorlist") {
214                 dialog->bc().view(new GBC(dialog->bc()));
215                 dialog->setController(new ControlErrorList(*dialog));
216                 dialog->setView(new GErrorList(*dialog));
217                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
218         } else if (name == "ert") {
219                 dialog->setController(new ControlERT(*dialog));
220                 dialog->setView(new FormERT(*dialog));
221                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
222         } else if (name == "external") {
223                 dialog->setController(new ControlExternal(*dialog));
224                 dialog->setView(new FormExternal(*dialog));
225                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
226         } else if (name == "file") {
227                 dialog->setController(new ControlShowFile(*dialog));
228                 dialog->setView(new FormShowFile(*dialog));
229                 dialog->bc().bp(new OkCancelPolicy);
230         } else if (name == "findreplace") {
231                 dialog->bc().view(new GBC(dialog->bc()));
232                 dialog->setController(new ControlSearch(*dialog));
233                 dialog->setView(new GSearch(*dialog));
234                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
235         } else if (name == "float") {
236                 dialog->setController(new ControlFloat(*dialog));
237                 dialog->setView(new FormFloat(*dialog));
238                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
239         } else if (name == "graphics") {
240                 dialog->setController(new ControlGraphics(*dialog));
241                 dialog->setView(new FormGraphics(*dialog));
242                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
243         } else if (name == "include") {
244                 dialog->setController(new ControlInclude(*dialog));
245                 dialog->setView(new FormInclude(*dialog));
246                 dialog->bc().bp(new OkApplyCancelReadOnlyPolicy);
247         } else if (name == "index") {
248                 dialog->bc().view(new GBC(dialog->bc()));
249                 dialog->setController(new ControlCommand(*dialog, name));
250                 dialog->setView(new GText(*dialog,
251                                           _("Index"), _("Keyword:|#K")));
252                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
253         } else if (name == "label") {
254                 dialog->bc().view(new GBC(dialog->bc()));
255                 dialog->setController(new ControlCommand(*dialog, name));
256                 dialog->setView(new GText(*dialog,
257                                           _("Label"), _("Label:|#L")));
258                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
259         } else if (name == "log") {
260                 dialog->setController(new ControlLog(*dialog));
261                 dialog->setView(new FormLog(*dialog));
262                 dialog->bc().bp(new OkCancelPolicy);
263
264         } else if (name == "mathpanel") {
265                 dialog->bc().view(new GBC(dialog->bc()));
266                 dialog->setController(new ControlMath(*dialog));
267                 dialog->setView(new GMathPanel(*dialog));
268                 dialog->bc().bp(new IgnorantPolicy);
269
270         } else if (name == "mathaccents") {
271                 FormMathsBitmap * bitmap =
272                         createFormBitmap(*dialog, _("Maths Decorations & Accents"),
273                                          latex_deco, nr_latex_deco);
274                 bitmap->addBitmap(
275                         BitmapStore(12, 3, 4, deco1_width, deco1_height, deco1_bits, true));
276                 bitmap->addBitmap(
277                         BitmapStore(10, 4, 3, deco2_width, deco2_height, deco2_bits, true));
278
279                 dialog->setController(new ControlMath(*dialog));
280                 dialog->setView(bitmap);
281                 dialog->bc().bp(new IgnorantPolicy);
282
283         } else if (name == "matharrows") {
284                 FormMathsBitmap * bitmap =
285                         createFormBitmap(*dialog, _("Arrows"), latex_arrow, nr_latex_arrow);
286                 bitmap->addBitmap(
287                         BitmapStore(20, 5, 4, arrow_width,  arrow_height,  arrow_bits, true));
288                 bitmap->addBitmap(
289                         BitmapStore(7,  2, 4, larrow_width, larrow_height, larrow_bits, false));
290                 bitmap->addBitmap(
291                         BitmapStore(4,  2, 2, darrow_width,  darrow_height, darrow_bits, true));
292
293                 dialog->setController(new ControlMath(*dialog));
294                 dialog->setView(bitmap);
295                 dialog->bc().bp(new IgnorantPolicy);
296
297         } else if (name == "mathoperators") {
298                 FormMathsBitmap * bitmap =
299                         createFormBitmap(*dialog, _("Binary Ops"),
300                                          latex_bop, nr_latex_bop);
301                 bitmap->addBitmap(
302                         BitmapStore(31, 4, 8, bop_width, bop_height, bop_bits, true));
303
304                 dialog->setController(new ControlMath(*dialog));
305                 dialog->setView(bitmap);
306                 dialog->bc().bp(new IgnorantPolicy);
307
308         } else if (name == "mathrelations") {
309                 FormMathsBitmap * bitmap =
310                         createFormBitmap(*dialog, _("Binary Relations"),
311                                          latex_brel, nr_latex_brel);
312                 bitmap->addBitmap(
313                         BitmapStore(35, 4, 9, brel_width, brel_height, brel_bits, true));
314
315                 dialog->setController(new ControlMath(*dialog));
316                 dialog->setView(bitmap);
317                 dialog->bc().bp(new IgnorantPolicy);
318
319         } else if (name == "mathgreek") {
320                 FormMathsBitmap * bitmap =
321                         createFormBitmap(*dialog, _("Greek"),
322                                          latex_greek, nr_latex_greek);
323                 bitmap->addBitmap(
324                         BitmapStore(11, 6, 2, Greek_width, Greek_height, Greek_bits, true));
325                 bitmap->addBitmap(
326                         BitmapStore(28, 7, 4, greek_width, greek_height, greek_bits, true));
327
328                 dialog->setController(new ControlMath(*dialog));
329                 dialog->setView(bitmap);
330                 dialog->bc().bp(new IgnorantPolicy);
331
332         } else if (name == "mathmisc") {
333                 FormMathsBitmap * bitmap =
334                         createFormBitmap(*dialog, _("Misc"),
335                                          latex_misc, nr_latex_misc);
336                 bitmap->addBitmap(
337                         BitmapStore(29, 5, 6, misc_width, misc_height, misc_bits, true));
338                 bitmap->addBitmap(
339                         BitmapStore(5, 5, 1, misc4_width, misc4_height, misc4_bits, true));
340                 bitmap->addBitmap(
341                         BitmapStore(6, 3, 2, misc2_width, misc2_height, misc2_bits, false));
342                 bitmap->addBitmap(
343                         BitmapStore(4, 2, 2, misc3_width, misc3_height, misc3_bits, true));
344
345                 dialog->setController(new ControlMath(*dialog));
346                 dialog->setView(bitmap);
347                 dialog->bc().bp(new IgnorantPolicy);
348
349         } else if (name == "mathdots") {
350                 FormMathsBitmap * bitmap =
351                         createFormBitmap(*dialog, _("Dots"),
352                                          latex_dots, nr_latex_dots);
353                 bitmap->addBitmap(
354                         BitmapStore(4, 4, 1, dots_width, dots_height, dots_bits, true));
355
356                 dialog->setController(new ControlMath(*dialog));
357                 dialog->setView(bitmap);
358                 dialog->bc().bp(new IgnorantPolicy);
359
360         } else if (name == "mathbigoperators") {
361                 FormMathsBitmap * bitmap =
362                         createFormBitmap(*dialog, _("Big Operators"),
363                                          latex_varsz, nr_latex_varsz);
364                 bitmap->addBitmap(
365                         BitmapStore(14, 3, 5, varsz_width, varsz_height, varsz_bits, true));
366
367                 dialog->setController(new ControlMath(*dialog));
368                 dialog->setView(bitmap);
369                 dialog->bc().bp(new IgnorantPolicy);
370
371         } else if (name == "mathamsmisc") {
372                 FormMathsBitmap * bitmap =
373                         createFormBitmap(*dialog, _("AMS Misc"),
374                                          latex_ams_misc, nr_latex_ams_misc);
375                 bitmap->addBitmap(
376                         BitmapStore(9, 5, 2, ams1_width, ams1_height, ams1_bits, true));
377                 bitmap->addBitmap(
378                         BitmapStore(26, 3, 9, ams7_width, ams7_height, ams7_bits, true));
379
380                 dialog->setController(new ControlMath(*dialog));
381                 dialog->setView(bitmap);
382                 dialog->bc().bp(new IgnorantPolicy);
383
384         } else if (name == "mathamsarrows") {
385                 FormMathsBitmap * bitmap =
386                         createFormBitmap(*dialog, _("AMS Arrows"),
387                                          latex_ams_arrows, nr_latex_ams_arrows);
388                 bitmap->addBitmap(
389                         BitmapStore(32, 3, 11, ams2_width, ams2_height, ams2_bits, true));
390                 bitmap->addBitmap(
391                         BitmapStore(6, 3, 2, ams3_width, ams3_height, ams3_bits, true));
392
393                 dialog->setController(new ControlMath(*dialog));
394                 dialog->setView(bitmap);
395                 dialog->bc().bp(new IgnorantPolicy);
396
397         } else if (name == "mathamsrelations") {
398                 FormMathsBitmap * bitmap =
399                         createFormBitmap(*dialog, _("AMS Relations"),
400                                          latex_ams_rel, nr_latex_ams_rel);
401                 bitmap->addBitmap(
402                         BitmapStore(66, 6, 11, ams_rel_width, ams_rel_height, ams_rel_bits, true));
403
404                 dialog->setController(new ControlMath(*dialog));
405                 dialog->setView(bitmap);
406                 dialog->bc().bp(new IgnorantPolicy);
407
408         } else if (name == "mathamsnegatedrelations") {
409                 FormMathsBitmap * bitmap =
410                         createFormBitmap(*dialog, _("AMS Negated Rel"),
411                                          latex_ams_nrel, nr_latex_ams_nrel);
412                 bitmap->addBitmap(
413                         BitmapStore(51, 6, 9, ams_nrel_width, ams_nrel_height, ams_nrel_bits, true));
414
415                 dialog->setController(new ControlMath(*dialog));
416                 dialog->setView(bitmap);
417                 dialog->bc().bp(new IgnorantPolicy);
418
419         } else if (name == "mathamsoperators") {
420                 FormMathsBitmap * bitmap =
421                         createFormBitmap(*dialog, _("AMS Operators"),
422                                          latex_ams_ops, nr_latex_ams_ops);
423                 bitmap->addBitmap(
424                         BitmapStore(23, 3, 8, ams_ops_width, ams_ops_height, ams_ops_bits, true));
425
426                 dialog->setController(new ControlMath(*dialog));
427                 dialog->setView(bitmap);
428                 dialog->bc().bp(new IgnorantPolicy);
429
430         } else if (name == "mathdelimiter") {
431                 dialog->bc().view(new GBC(dialog->bc()));
432                 dialog->setController(new ControlMath(*dialog));
433                 dialog->setView(new GMathDelim(*dialog));
434                 dialog->bc().bp(new OkApplyCancelReadOnlyPolicy);
435         } else if (name == "mathmatrix") {
436                 dialog->bc().view(new GBC(dialog->bc()));
437                 dialog->setController(new ControlMath(*dialog));
438                 dialog->setView(new GMathsMatrix(*dialog));
439                 dialog->bc().bp(new OkCancelReadOnlyPolicy);
440         } else if (name == "mathspace") {
441                 dialog->setController(new ControlMath(*dialog));
442                 dialog->setView(new FormMathsSpace(*dialog));
443                 dialog->bc().bp(new IgnorantPolicy);
444         } else if (name == "mathstyle") {
445                 dialog->setController(new ControlMath(*dialog));
446                 dialog->setView(new FormMathsStyle(*dialog));
447                 dialog->bc().bp(new IgnorantPolicy);
448         } else if (name == "note") {
449                 dialog->setController(new ControlNote(*dialog));
450                 dialog->setView(new FormNote(*dialog));
451                 dialog->bc().bp(new OkApplyCancelReadOnlyPolicy);
452         } else if (name == "branch") {
453                 dialog->setController(new ControlBranch(*dialog));
454                 dialog->setView(new FormBranch(*dialog));
455                 dialog->bc().bp(new OkApplyCancelReadOnlyPolicy);
456         } else if (name == "paragraph") {
457                 dialog->bc().view(new GBC(dialog->bc()));
458                 dialog->setController(new ControlParagraph(*dialog));
459                 dialog->setView(new GParagraph(*dialog));
460                 dialog->bc().bp(new OkApplyCancelReadOnlyPolicy);
461         } else if (name == "preamble") {
462                 dialog->setController(new ControlPreamble(*dialog));
463                 dialog->setView(new FormPreamble(*dialog));
464                 dialog->bc().bp(new OkApplyCancelPolicy);
465         } else if (name == "prefs") {
466                 dialog->setController(new ControlPrefs(*dialog));
467                 dialog->setView(new FormPreferences(*dialog));
468                 dialog->bc().bp(new PreferencesPolicy);
469         } else if (name == "print") {
470                 dialog->bc().view(new GBC(dialog->bc()));
471                 dialog->setController(new ControlPrint(*dialog));
472                 dialog->setView(new GPrint(*dialog));
473                 dialog->bc().bp(new OkCancelPolicy);
474         } else if (name == "ref") {
475                 dialog->setController(new ControlRef(*dialog));
476                 dialog->setView(new FormRef(*dialog));
477                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
478         } else if (name == "sendto") {
479                 dialog->setController(new ControlSendto(*dialog));
480                 dialog->setView(new FormSendto(*dialog));
481                 dialog->bc().bp(new OkApplyCancelPolicy);
482         } else if (name == "spellchecker") {
483                 dialog->bc().view(new GBC(dialog->bc()));
484                 dialog->setController(new ControlSpellchecker(*dialog));
485                 dialog->setView(new GSpellchecker(*dialog));
486                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
487         } else if (name == "tabular") {
488                 dialog->setController(new ControlTabular(*dialog));
489                 dialog->setView(new FormTabular(*dialog));
490                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
491         } else if (name == "tabularcreate") {
492                 dialog->bc().view(new GBC(dialog->bc()));
493                 dialog->setController(new ControlTabularCreate(*dialog));
494                 dialog->setView(new GTableCreate(*dialog));
495                 dialog->bc().bp(new IgnorantPolicy);
496         } else if (name == "texinfo") {
497                 dialog->bc().view(new GBC(dialog->bc()));
498                 dialog->setController(new ControlTexinfo(*dialog));
499                 dialog->setView(new GTexinfo(*dialog));
500                 dialog->bc().bp(new OkCancelPolicy);
501 #ifdef HAVE_LIBAIKSAURUS
502         } else if (name == "thesaurus") {
503                 dialog->setController(new ControlThesaurus(*dialog));
504                 dialog->setView(new FormThesaurus(*dialog));
505                 dialog->bc().bp(new OkApplyCancelReadOnlyPolicy);
506 #endif
507         } else if (name == "toc") {
508                 dialog->bc().view(new GBC(dialog->bc()));
509                 dialog->setController(new ControlToc(*dialog));
510                 dialog->setView(new GToc(*dialog));
511                 dialog->bc().bp(new OkCancelPolicy);
512         } else if (name == "url") {
513                 dialog->bc().view(new GBC(dialog->bc()));
514                 dialog->setController(new ControlCommand(*dialog, name));
515                 dialog->setView(new GUrl(*dialog));
516                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
517         } else if (name == "vspace") {
518                 dialog->setController(new ControlVSpace(*dialog));
519                 dialog->setView(new FormVSpace(*dialog));
520                 dialog->bc().bp(new OkApplyCancelReadOnlyPolicy);
521         } else if (name == "wrap") {
522                 dialog->setController(new ControlWrap(*dialog));
523                 dialog->setView(new FormWrap(*dialog));
524                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
525         }
526
527         return dialog;
528 }
529
530
531 void Dialogs::toggleTooltips()
532 {
533         Tooltips::toggleEnabled();
534 }
535
536
537 /// Are the tooltips on or off?
538 bool Dialogs::tooltipsEnabled()
539 {
540         return Tooltips::enabled();
541 }