Commit 7e400b526c30d7dd7888b3312a2b826b6c1c9e41
1 parent
dd00e7c4
Exists in
master
Ajustes para OTRS 5.0.x
Showing
7 changed files
with
197 additions
and
196 deletions
Show diff stats
CreateOpm.sh
Kernel/Config/Files/QueueService.xml
... | ... | @@ -13,7 +13,7 @@ |
13 | 13 | <Title Lang="pt_BR">Serviços por fila</Title> |
14 | 14 | <NavBarName>Admin</NavBarName> |
15 | 15 | <NavBarModule> |
16 | - <Module>Kernel::Output::HTML::NavBarModuleAdmin</Module> | |
16 | + <Module>Kernel::Output::HTML::NavBar::ModuleAdmin</Module> | |
17 | 17 | <Name Lang="en">Services per queue</Name> |
18 | 18 | <Name Lang="pt_BR">Serviços por fila</Name> |
19 | 19 | <Description Lang="en">Create and manages services per queue</Description> | ... | ... |
Kernel/Output/HTML/Standard/QueueService.tt
... | ... | @@ -1,86 +0,0 @@ |
1 | -# -- | |
2 | -# Kernel/Output/HTML/Standard/QueueService.tt - overview | |
3 | -# Copyright (C) (2014) SeTIC - UFSC - http://setic.ufsc.br/ | |
4 | -# Version 06/01/2015 - Adjusts for OTRS 4 | |
5 | -# | |
6 | -# This software comes with ABSOLUTELY NO WARRANTY. For details, see | |
7 | -# the enclosed file COPYING for license information (AGPL). If you | |
8 | -# did not receive this file, see http://www.gnu.org/licenses/agpl.txt. | |
9 | -# -- | |
10 | -<div class="MainBox ARIARoleMain LayoutFixedSidebar SidebarFirst"> | |
11 | - <h1>[% Translate("Services per queue") | html %]</h1> | |
12 | - | |
13 | - <div class="SidebarColumn"> | |
14 | - | |
15 | - <div class="WidgetSimple"> | |
16 | - <div class="Header"> | |
17 | - <h2>[% Translate("Actions") | html %]</h2> | |
18 | - </div> | |
19 | - <div class="Content"> | |
20 | - <ul class="ActionList"> | |
21 | - <li> | |
22 | - <a href="[% Env("Baselink") %]Action=[% Env("Action") %]" class="CallForAction"><span>[% Translate("Go to overview") | html %]</span></a> | |
23 | - </li> | |
24 | - </ul> | |
25 | - </div> | |
26 | - </div> | |
27 | - | |
28 | -[% RenderBlockStart("serviceFilter") %] | |
29 | - <div class="WidgetSimple"> | |
30 | - <div class="Header"> | |
31 | - <h2><label for="FilterServices">[% Translate("Services") | html %]</label></h2> | |
32 | - </div> | |
33 | - <div class="Content"> | |
34 | - <input type="text" id="FilterUsers" class="W50pc" name="FilterUser" value="" title="[% Translate("Service") | html %]" /> | |
35 | - </div> | |
36 | - </div> | |
37 | -[% RenderBlockEnd("serviceFilter") %] | |
38 | -[% RenderBlockStart("queueFilter") %] | |
39 | - <div class="WidgetSimple"> | |
40 | - <div class="Header"> | |
41 | - <h2><label for="FilterQueues">[% Translate("Queues") | html %]</label></h2> | |
42 | - </div> | |
43 | - <div class="Content"> | |
44 | - <input type="text" id="FilterGroups" class="W50pc" name="FilterGroups" value="" title="[% Translate("Queue") | html %]"/> | |
45 | - </div> | |
46 | - </div> | |
47 | -[% RenderBlockEnd("queueFilter") %] | |
48 | - </div> | |
49 | - | |
50 | - <div class="ContentColumn"> | |
51 | - <div class="WidgetSimple"> | |
52 | - | |
53 | - <div class="Header"> | |
54 | - <h2>[% Translate("Overview") | html %]</h2> | |
55 | - </div> | |
56 | - <div class="Content LayoutGrid ColumnsWithSpacing"> | |
57 | - <div class="Size1of2"> | |
58 | - <ul class="Tablelike" id="Services"> | |
59 | - <li class="Header">[% Translate("Services") | html %]</li> | |
60 | - <li class="FilterMessage Hidden">[% Translate("No matches found.") | html %]</li> | |
61 | -[% RenderBlockStart("ListService") %] | |
62 | - <li><a href="[% Env("Baselink") %]Action=[% Env("Action") %];Subaction=ServiceEdit;ID=[% Data.ServiceID | uri %]" class="AsBlock">[% Data.ServiceName | html %]</a></li> | |
63 | -[% RenderBlockEnd("ListService") %] | |
64 | - </ul> | |
65 | - </div> | |
66 | - <div class="Size1of2"> | |
67 | - <ul class="Tablelike" id="Queues"> | |
68 | - <li class="Header">[% Translate("Queues") | html %]</li> | |
69 | - <li class="FilterMessage Hidden">[% Translate("No matches found.") | html %]</li> | |
70 | -[% RenderBlockStart("ListQueue") %] | |
71 | - <li><a href="[% Env("Baselink") %]Action=[% Env("Action") %];Subaction=QueueEdit;ID=[% Data.QueueID | uri %]" class="AsBlock">[% Data.QueueName | html %]</a></li> | |
72 | -[% RenderBlockEnd("ListQueue") %] | |
73 | - </ul> | |
74 | - </div> | |
75 | - <div class="Clear"></div> | |
76 | - </div> | |
77 | - | |
78 | - | |
79 | -[% WRAPPER JSOnDocumentComplete %] | |
80 | -<script type="text/javascript">//<![CDATA[ | |
81 | - Core.UI.Table.InitTableFilter($('#FilterServices'), $('#Services')); | |
82 | - Core.UI.Table.InitTableFilter($('#FilterQueues'), $('#Queues')); | |
83 | -//]]></script> | |
84 | -[% END %] | |
85 | - | |
86 | - | |
87 | 0 | \ No newline at end of file |
Kernel/Output/HTML/Standard/QueueServiceChange.tt
... | ... | @@ -1,103 +0,0 @@ |
1 | -# -- | |
2 | -# Kernel/Output/HTML/Standard/QueueServiceChange.tt - edit | |
3 | -# Copyright (C) (2014) SeTIC - UFSC - http://setic.ufsc.br/ | |
4 | -# Version 06/01/2015 - Adjusts for OTRS 4 | |
5 | -# | |
6 | -# This software comes with ABSOLUTELY NO WARRANTY. For details, see | |
7 | -# the enclosed file COPYING for license information (AGPL). If you | |
8 | -# did not receive this file, see http://www.gnu.org/licenses/agpl.txt. | |
9 | -# -- | |
10 | -<div class="MainBox ARIARoleMain LayoutFixedSidebar SidebarFirst"> | |
11 | - <h1>[% Translate("Services and queues") | html %]</h1> | |
12 | - <div class="SidebarColumn"> | |
13 | - <div class="WidgetSimple"> | |
14 | - <div class="Header"> | |
15 | - <h2>[% Translate("Actions") | html %]</h2> | |
16 | - </div> | |
17 | - <div class="Content"> | |
18 | - <ul class="ActionList"> | |
19 | - <li> | |
20 | - <a href="[% Env("Baselink") %]Action=[% Env("Action") %]" class="CallForAction"><span>[% Translate("Go to overview") | html %]</span></a> | |
21 | - </li> | |
22 | - </ul> | |
23 | - </div> | |
24 | - </div> | |
25 | - <div class="WidgetSimple"> | |
26 | - <div class="Header"> | |
27 | - <h2> | |
28 | - <label for="Filter">[% Translate("Filter") | html %]</label> | |
29 | - </h2> | |
30 | - </div> | |
31 | - <div class="Content"> | |
32 | - <input type="text" id="Filter" class="W50pc" name="Filter" value="" title="[% Translate("Filter") | html %]" /> | |
33 | - </div> | |
34 | - </div> | |
35 | - </div> | |
36 | - | |
37 | - <div class="ContentColumn"> | |
38 | - <div class="WidgetSimple"> | |
39 | - <div class="Header"> | |
40 | - <h2> | |
41 | -[% RenderBlockStart("ChangeHeaderService") %] | |
42 | - [% Translate("Select queues for the service") | html %] | |
43 | -[% RenderBlockEnd("ChangeHeaderService") %] | |
44 | -[% RenderBlockStart("ChangeHeaderQueue") %] | |
45 | - [% Translate("Select services for the queue") | html %] | |
46 | -[% RenderBlockEnd("ChangeHeaderQueue") %] | |
47 | - [% Data.Name | html %] | |
48 | - </h2> | |
49 | - </div> | |
50 | - <div class="Content "> | |
51 | - <form action="[% Env("CGIHandle") %]" method="post" name="matrix"> | |
52 | - <input type="hidden" name="Action" value="[% Env("Action") %]"/> | |
53 | - <input type="hidden" name="Subaction" value="Change[% Data.VisibleNeType | html %]"/> | |
54 | - <input type="hidden" name="ID" value="[% Data.ID | html %]"/> | |
55 | - <table class="DataTable VariableWidth" id="ServicesQueues"> | |
56 | - <thead> | |
57 | - <tr> | |
58 | - <th>[% Translate(Data.VisibleNeType) | html %]</th> | |
59 | -[% RenderBlockStart("ChangeHeader") %] | |
60 | - <th class="Center [% Data.Mark | html %]"> | |
61 | - <input type="checkbox" name="[% Data.Type | html %]" id="SelectAll[% Data.Type | html %]" title="[% Translate("Toggle active state for all") | html %]" value="" /> | |
62 | - [% Translate("Active") | html %] | |
63 | - </th> | |
64 | -[% WRAPPER JSOnDocumentComplete %] | |
65 | -<script type="text/javascript">//<![CDATA[ | |
66 | - Core.Form.InitSelectAllCheckboxes($('table td input:checkbox[name=[% Data.Type | html %]]'), $('#SelectAll[% Data.Type | html %]')); | |
67 | - $('input:checkbox[name=[% Data.Type | html %]]').bind('click', function () { | |
68 | - Core.Form.SelectAllCheckboxes($(this), $('#SelectAll[% Data.Type | html %]')); | |
69 | - }); | |
70 | -//]]></script> | |
71 | -[% END %] | |
72 | -[% RenderBlockEnd("ChangeHeader") %] | |
73 | - </tr> | |
74 | - </thead> | |
75 | - <tbody> | |
76 | -[% RenderBlockStart("ChangeRow") %] | |
77 | - <tr> | |
78 | - <td>[% Data.Name | html %]</td> | |
79 | - <td class="[% Data.Mark | html %]"> | |
80 | - <input type="checkbox" name="[% Data.Type | html %]" title="[% Translate("Toggle active state for %s", Data.Name) | html %]" value="[% Data.ID | html %]" [% Data.Selected %]/> | |
81 | - </td> | |
82 | - </tr> | |
83 | -[% RenderBlockEnd("ChangeRow") %] | |
84 | - </tbody> | |
85 | - </table> | |
86 | - <div class="Field SpacingTop"> | |
87 | - <button class="Primary" type="submit" value="[% Translate("Submit") | html %]">[% Translate("Submit") | html %]</button> | |
88 | - [% Translate("or") | html %] | |
89 | - <a href="[% Env("Baselink") %]Action=[% Env("Action") %]">[% Translate("Cancel") | html %]</a> | |
90 | - </div> | |
91 | - <div class="Clear"></div> | |
92 | - </form> | |
93 | - </div> | |
94 | - </div> | |
95 | - </div> | |
96 | - <div class="Clear"></div> | |
97 | -</div> | |
98 | - | |
99 | -[% WRAPPER JSOnDocumentComplete %] | |
100 | -<script type="text/javascript">//<![CDATA[ | |
101 | - Core.UI.Table.InitTableFilter($('#Filter'), $('#ServicesQueues')); | |
102 | -//]]></script> | |
103 | -[% END %] |
... | ... | @@ -0,0 +1,86 @@ |
1 | +# -- | |
2 | +# Kernel/Output/HTML/Standard/QueueService.tt - overview | |
3 | +# Copyright (C) (2014) SeTIC - UFSC - http://setic.ufsc.br/ | |
4 | +# Version 06/01/2015 - Adjusts for OTRS 4 | |
5 | +# | |
6 | +# This software comes with ABSOLUTELY NO WARRANTY. For details, see | |
7 | +# the enclosed file COPYING for license information (AGPL). If you | |
8 | +# did not receive this file, see http://www.gnu.org/licenses/agpl.txt. | |
9 | +# -- | |
10 | +<div class="MainBox ARIARoleMain LayoutFixedSidebar SidebarFirst"> | |
11 | + <h1>[% Translate("Services per queue") | html %]</h1> | |
12 | + | |
13 | + <div class="SidebarColumn"> | |
14 | + | |
15 | + <div class="WidgetSimple"> | |
16 | + <div class="Header"> | |
17 | + <h2>[% Translate("Actions") | html %]</h2> | |
18 | + </div> | |
19 | + <div class="Content"> | |
20 | + <ul class="ActionList"> | |
21 | + <li> | |
22 | + <a href="[% Env("Baselink") %]Action=[% Env("Action") %]" class="CallForAction"><span>[% Translate("Go to overview") | html %]</span></a> | |
23 | + </li> | |
24 | + </ul> | |
25 | + </div> | |
26 | + </div> | |
27 | + | |
28 | +[% RenderBlockStart("serviceFilter") %] | |
29 | + <div class="WidgetSimple"> | |
30 | + <div class="Header"> | |
31 | + <h2><label for="FilterServices">[% Translate("Services") | html %]</label></h2> | |
32 | + </div> | |
33 | + <div class="Content"> | |
34 | + <input type="text" id="FilterUsers" class="W50pc" name="FilterUser" value="" title="[% Translate("Service") | html %]" /> | |
35 | + </div> | |
36 | + </div> | |
37 | +[% RenderBlockEnd("serviceFilter") %] | |
38 | +[% RenderBlockStart("queueFilter") %] | |
39 | + <div class="WidgetSimple"> | |
40 | + <div class="Header"> | |
41 | + <h2><label for="FilterQueues">[% Translate("Queues") | html %]</label></h2> | |
42 | + </div> | |
43 | + <div class="Content"> | |
44 | + <input type="text" id="FilterGroups" class="W50pc" name="FilterGroups" value="" title="[% Translate("Queue") | html %]"/> | |
45 | + </div> | |
46 | + </div> | |
47 | +[% RenderBlockEnd("queueFilter") %] | |
48 | + </div> | |
49 | + | |
50 | + <div class="ContentColumn"> | |
51 | + <div class="WidgetSimple"> | |
52 | + | |
53 | + <div class="Header"> | |
54 | + <h2>[% Translate("Overview") | html %]</h2> | |
55 | + </div> | |
56 | + <div class="Content LayoutGrid ColumnsWithSpacing"> | |
57 | + <div class="Size1of2"> | |
58 | + <ul class="Tablelike" id="Services"> | |
59 | + <li class="Header">[% Translate("Services") | html %]</li> | |
60 | + <li class="FilterMessage Hidden">[% Translate("No matches found.") | html %]</li> | |
61 | +[% RenderBlockStart("ListService") %] | |
62 | + <li><a href="[% Env("Baselink") %]Action=[% Env("Action") %];Subaction=ServiceEdit;ID=[% Data.ServiceID | uri %]" class="AsBlock">[% Data.ServiceName | html %]</a></li> | |
63 | +[% RenderBlockEnd("ListService") %] | |
64 | + </ul> | |
65 | + </div> | |
66 | + <div class="Size1of2"> | |
67 | + <ul class="Tablelike" id="Queues"> | |
68 | + <li class="Header">[% Translate("Queues") | html %]</li> | |
69 | + <li class="FilterMessage Hidden">[% Translate("No matches found.") | html %]</li> | |
70 | +[% RenderBlockStart("ListQueue") %] | |
71 | + <li><a href="[% Env("Baselink") %]Action=[% Env("Action") %];Subaction=QueueEdit;ID=[% Data.QueueID | uri %]" class="AsBlock">[% Data.QueueName | html %]</a></li> | |
72 | +[% RenderBlockEnd("ListQueue") %] | |
73 | + </ul> | |
74 | + </div> | |
75 | + <div class="Clear"></div> | |
76 | + </div> | |
77 | + | |
78 | + | |
79 | +[% WRAPPER JSOnDocumentComplete %] | |
80 | +<script type="text/javascript">//<![CDATA[ | |
81 | + Core.UI.Table.InitTableFilter($('#FilterServices'), $('#Services')); | |
82 | + Core.UI.Table.InitTableFilter($('#FilterQueues'), $('#Queues')); | |
83 | +//]]></script> | |
84 | +[% END %] | |
85 | + | |
86 | + | |
0 | 87 | \ No newline at end of file | ... | ... |
Kernel/Output/HTML/Templates/Standard/QueueServiceChange.tt
0 → 100644
... | ... | @@ -0,0 +1,103 @@ |
1 | +# -- | |
2 | +# Kernel/Output/HTML/Standard/QueueServiceChange.tt - edit | |
3 | +# Copyright (C) (2014) SeTIC - UFSC - http://setic.ufsc.br/ | |
4 | +# Version 06/01/2015 - Adjusts for OTRS 4 | |
5 | +# | |
6 | +# This software comes with ABSOLUTELY NO WARRANTY. For details, see | |
7 | +# the enclosed file COPYING for license information (AGPL). If you | |
8 | +# did not receive this file, see http://www.gnu.org/licenses/agpl.txt. | |
9 | +# -- | |
10 | +<div class="MainBox ARIARoleMain LayoutFixedSidebar SidebarFirst"> | |
11 | + <h1>[% Translate("Services and queues") | html %]</h1> | |
12 | + <div class="SidebarColumn"> | |
13 | + <div class="WidgetSimple"> | |
14 | + <div class="Header"> | |
15 | + <h2>[% Translate("Actions") | html %]</h2> | |
16 | + </div> | |
17 | + <div class="Content"> | |
18 | + <ul class="ActionList"> | |
19 | + <li> | |
20 | + <a href="[% Env("Baselink") %]Action=[% Env("Action") %]" class="CallForAction"><span>[% Translate("Go to overview") | html %]</span></a> | |
21 | + </li> | |
22 | + </ul> | |
23 | + </div> | |
24 | + </div> | |
25 | + <div class="WidgetSimple"> | |
26 | + <div class="Header"> | |
27 | + <h2> | |
28 | + <label for="Filter">[% Translate("Filter") | html %]</label> | |
29 | + </h2> | |
30 | + </div> | |
31 | + <div class="Content"> | |
32 | + <input type="text" id="Filter" class="W50pc" name="Filter" value="" title="[% Translate("Filter") | html %]" /> | |
33 | + </div> | |
34 | + </div> | |
35 | + </div> | |
36 | + | |
37 | + <div class="ContentColumn"> | |
38 | + <div class="WidgetSimple"> | |
39 | + <div class="Header"> | |
40 | + <h2> | |
41 | +[% RenderBlockStart("ChangeHeaderService") %] | |
42 | + [% Translate("Select queues for the service") | html %] | |
43 | +[% RenderBlockEnd("ChangeHeaderService") %] | |
44 | +[% RenderBlockStart("ChangeHeaderQueue") %] | |
45 | + [% Translate("Select services for the queue") | html %] | |
46 | +[% RenderBlockEnd("ChangeHeaderQueue") %] | |
47 | + [% Data.Name | html %] | |
48 | + </h2> | |
49 | + </div> | |
50 | + <div class="Content "> | |
51 | + <form action="[% Env("CGIHandle") %]" method="post" name="matrix"> | |
52 | + <input type="hidden" name="Action" value="[% Env("Action") %]"/> | |
53 | + <input type="hidden" name="Subaction" value="Change[% Data.VisibleNeType | html %]"/> | |
54 | + <input type="hidden" name="ID" value="[% Data.ID | html %]"/> | |
55 | + <table class="DataTable VariableWidth" id="ServicesQueues"> | |
56 | + <thead> | |
57 | + <tr> | |
58 | + <th>[% Translate(Data.VisibleNeType) | html %]</th> | |
59 | +[% RenderBlockStart("ChangeHeader") %] | |
60 | + <th class="Center [% Data.Mark | html %]"> | |
61 | + <input type="checkbox" name="[% Data.Type | html %]" id="SelectAll[% Data.Type | html %]" title="[% Translate("Toggle active state for all") | html %]" value="" /> | |
62 | + [% Translate("Active") | html %] | |
63 | + </th> | |
64 | +[% WRAPPER JSOnDocumentComplete %] | |
65 | +<script type="text/javascript">//<![CDATA[ | |
66 | + Core.Form.InitSelectAllCheckboxes($('table td input:checkbox[name=[% Data.Type | html %]]'), $('#SelectAll[% Data.Type | html %]')); | |
67 | + $('input:checkbox[name=[% Data.Type | html %]]').bind('click', function () { | |
68 | + Core.Form.SelectAllCheckboxes($(this), $('#SelectAll[% Data.Type | html %]')); | |
69 | + }); | |
70 | +//]]></script> | |
71 | +[% END %] | |
72 | +[% RenderBlockEnd("ChangeHeader") %] | |
73 | + </tr> | |
74 | + </thead> | |
75 | + <tbody> | |
76 | +[% RenderBlockStart("ChangeRow") %] | |
77 | + <tr> | |
78 | + <td>[% Data.Name | html %]</td> | |
79 | + <td class="[% Data.Mark | html %]"> | |
80 | + <input type="checkbox" name="[% Data.Type | html %]" title="[% Translate("Toggle active state for %s", Data.Name) | html %]" value="[% Data.ID | html %]" [% Data.Selected %]/> | |
81 | + </td> | |
82 | + </tr> | |
83 | +[% RenderBlockEnd("ChangeRow") %] | |
84 | + </tbody> | |
85 | + </table> | |
86 | + <div class="Field SpacingTop"> | |
87 | + <button class="Primary" type="submit" value="[% Translate("Submit") | html %]">[% Translate("Submit") | html %]</button> | |
88 | + [% Translate("or") | html %] | |
89 | + <a href="[% Env("Baselink") %]Action=[% Env("Action") %]">[% Translate("Cancel") | html %]</a> | |
90 | + </div> | |
91 | + <div class="Clear"></div> | |
92 | + </form> | |
93 | + </div> | |
94 | + </div> | |
95 | + </div> | |
96 | + <div class="Clear"></div> | |
97 | +</div> | |
98 | + | |
99 | +[% WRAPPER JSOnDocumentComplete %] | |
100 | +<script type="text/javascript">//<![CDATA[ | |
101 | + Core.UI.Table.InitTableFilter($('#Filter'), $('#ServicesQueues')); | |
102 | +//]]></script> | |
103 | +[% END %] | ... | ... |
QueueService.sopm
1 | 1 | <?xml version="1.0" encoding="utf-8" ?> |
2 | 2 | <otrs_package version="1.0"> |
3 | 3 | <Name>QueueService</Name> |
4 | - <Version>1.1.1</Version> | |
5 | - <Framework>4.0.x</Framework> | |
4 | + <Version>1.2.0</Version> | |
5 | + <Framework>5.0.x</Framework> | |
6 | 6 | <Vendor>SeTIC</Vendor> |
7 | 7 | <URL>http://setic.ufsc.br</URL> |
8 | 8 | <License>GPLv2</License> |
9 | 9 | |
10 | 10 | <ChangeLog Version="1.0.0" Date="2014-06-01">First Version</ChangeLog> |
11 | 11 | <ChangeLog Version="1.1.0" Date="2014-01-06">Support for OTRS 4</ChangeLog> |
12 | + <ChangeLog Version="1.2.0" Date="2014-01-06">Support for OTRS 5.0.x</ChangeLog> | |
12 | 13 | |
13 | 14 | <Description>Services per queue association</Description> |
14 | 15 | |
... | ... | @@ -23,8 +24,8 @@ |
23 | 24 | <File Permission="644" Location="Kernel/Config/Files/QueueService.xml"></File> |
24 | 25 | <File Permission="644" Location="Kernel/Language/pt_BR_QueueService.pm"></File> |
25 | 26 | <File Permission="644" Location="Kernel/Modules/QueueService.pm"></File> |
26 | - <File Permission="644" Location="Kernel/Output/HTML/Standard/QueueService.tt"></File> | |
27 | - <File Permission="644" Location="Kernel/Output/HTML/Standard/QueueServiceChange.tt"></File> | |
27 | + <File Permission="644" Location="Kernel/Output/HTML/Templates/Standard/QueueService.tt"></File> | |
28 | + <File Permission="644" Location="Kernel/Output/HTML/Templates/Standard/QueueServiceChange.tt"></File> | |
28 | 29 | <File Permission="644" Location="Kernel/System/QueueService.pm"></File> |
29 | 30 | </Filelist> |
30 | 31 | <DatabaseInstall> | ... | ... |