liquid_feedback_frontend
diff app/main/issue/_sidebar_whatcanido.lua @ 1045:701a5cf6b067
Imported LiquidFeedback Frontend 3.0 branch
author | bsw |
---|---|
date | Thu Jul 10 01:19:48 2014 +0200 (2014-07-10) |
parents | |
children | abee3e49cd44 |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/app/main/issue/_sidebar_whatcanido.lua Thu Jul 10 01:19:48 2014 +0200 1.3 @@ -0,0 +1,631 @@ 1.4 +local issue = param.get("issue", "table") 1.5 +local initiative = param.get("initiative", "table") 1.6 +local member = param.get("member", "table") or app.session.member 1.7 + 1.8 +if initiative then 1.9 + issue = initiative.issue 1.10 +end 1.11 + 1.12 +local privileged_to_vote = app.session.member and app.session.member:has_voting_right_for_unit_id(issue.area.unit_id) 1.13 + 1.14 +local active_trustee_id 1.15 +if member then 1.16 + if not issue.member_info.own_participation then 1.17 + if issue.member_info.first_trustee_participation then 1.18 + active_trustee_id = issue.member_info.first_trustee_id 1.19 + elseif issue.member_info.other_trustee_participation then 1.20 + active_trustee_id = issue.member_info.other_trustee_id 1.21 + end 1.22 + end 1.23 +end 1.24 + 1.25 +ui.sidebar ( "tab-whatcanido", function () 1.26 + 1.27 + ui.sidebarHeadWhatCanIDo() 1.28 + 1.29 + local supporter 1.30 + 1.31 + if initiative and app.session.member_id then 1.32 + supporter = app.session.member:get_reference_selector("supporters") 1.33 + :add_where{ "initiative_id = ?", initiative.id } 1.34 + :optional_object_mode() 1.35 + :exec() 1.36 + end 1.37 + 1.38 + local view_module 1.39 + local view_id 1.40 + 1.41 + if initiative then 1.42 + issue = issue 1.43 + view_module = "initiative" 1.44 + view_id = initiative.id 1.45 + else 1.46 + view_module = "issue" 1.47 + view_id = issue.id 1.48 + end 1.49 + 1.50 + local initiator 1.51 + if initiative and app.session.member_id then 1.52 + initiator = Initiator:by_pk(initiative.id, app.session.member.id) 1.53 + end 1.54 + 1.55 + local initiators 1.56 + 1.57 + if initiative then 1.58 + local initiators_members_selector = initiative:get_reference_selector("initiating_members") 1.59 + :add_field("initiator.accepted", "accepted") 1.60 + :add_order_by("member.name") 1.61 + if initiator and initiator.accepted then 1.62 + initiators_members_selector:add_where("initiator.accepted ISNULL OR initiator.accepted") 1.63 + else 1.64 + initiators_members_selector:add_where("initiator.accepted") 1.65 + end 1.66 + 1.67 + initiators = initiators_members_selector:exec() 1.68 + end 1.69 + 1.70 + if initiator and 1.71 + initiator.accepted and 1.72 + not issue.fully_frozen and 1.73 + not issue.closed and 1.74 + not initiative.revoked 1.75 + then 1.76 + 1.77 + ui.container { attr = { class = "sidebarRow" }, content = function () 1.78 + ui.heading { level = 3, content = function() 1.79 + ui.tag { content = _"You are initiator of this initiative" } 1.80 + end } 1.81 + ui.tag { tag = "ul", attr = { class = "ul" }, content = function () 1.82 + ui.tag { tag = "li", content = function () 1.83 + ui.link{ 1.84 + module = "draft", view = "new", 1.85 + params = { initiative_id = initiative.id }, 1.86 + content = _"edit proposal and/or reasons" 1.87 + } 1.88 + end } 1.89 + ui.tag { tag = "li", content = function () 1.90 + ui.link{ 1.91 + attr = { class = "action" }, 1.92 + module = "initiative", view = "add_initiator", 1.93 + params = { initiative_id = initiative.id }, 1.94 + content = _"invite another initiator" 1.95 + } 1.96 + end } 1.97 + if #initiative.initiators > 1 then 1.98 + ui.tag { tag = "li", content = function () 1.99 + ui.link{ 1.100 + module = "initiative", view = "remove_initiator", 1.101 + params = { initiative_id = initiative.id }, 1.102 + content = _"remove an initiator" 1.103 + } 1.104 + end } 1.105 + end 1.106 + ui.tag { tag = "li", content = function () 1.107 + ui.link{ 1.108 + module = "initiative", view = "revoke", id = initiative.id, 1.109 + content = _"revoke initiative" 1.110 + } 1.111 + end } 1.112 + end } 1.113 + end } 1.114 + end 1.115 + 1.116 + -- invited as initiator 1.117 + if initiator and initiator.accepted == nil and not initiative.issue.half_frozen and not initiative.issue.closed then 1.118 + ui.container { attr = { class = "sidebarRow highlighted" }, content = function () 1.119 + ui.heading { level = 3, content = function() 1.120 + ui.tag { content = _"You are invited to become initiator of this initiative" } 1.121 + end } 1.122 + ui.tag { tag = "ul", attr = { class = "ul" }, content = function () 1.123 + ui.tag{ tag = "li", content = function () 1.124 + ui.link{ 1.125 + content = _"accept invitation", 1.126 + module = "initiative", 1.127 + action = "accept_invitation", 1.128 + id = initiative.id, 1.129 + routing = { 1.130 + default = { 1.131 + mode = "redirect", 1.132 + module = request.get_module(), 1.133 + view = request.get_view(), 1.134 + id = param.get_id_cgi(), 1.135 + params = param.get_all_cgi() 1.136 + } 1.137 + } 1.138 + } 1.139 + end } 1.140 + 1.141 + ui.tag{ tag = "li", content = function () 1.142 + ui.link{ 1.143 + content = _"refuse invitation", 1.144 + module = "initiative", 1.145 + action = "reject_initiator_invitation", 1.146 + params = { 1.147 + initiative_id = initiative.id, 1.148 + member_id = app.session.member.id 1.149 + }, 1.150 + routing = { 1.151 + default = { 1.152 + mode = "redirect", 1.153 + module = request.get_module(), 1.154 + view = request.get_view(), 1.155 + id = param.get_id_cgi(), 1.156 + params = param.get_all_cgi() 1.157 + } 1.158 + } 1.159 + } 1.160 + end } 1.161 + end } 1.162 + end } 1.163 + end 1.164 + 1.165 + 1.166 + if privileged_to_vote and issue.member_info.first_trustee_id then 1.167 + local member = Member:by_id(issue.member_info.first_trustee_id) 1.168 + ui.sidebarSection( function () 1.169 + ui.container { attr = { class = "right" }, content = function() 1.170 + execute.view{ 1.171 + module = "member_image", 1.172 + view = "_show", 1.173 + params = { 1.174 + member = member, 1.175 + image_type = "avatar", 1.176 + show_dummy = true 1.177 + } 1.178 + } 1.179 + end } 1.180 + if issue.member_info.own_delegation_scope == "unit" then 1.181 + ui.heading{ level = 3, content = _"You delegated this organizational unit" } 1.182 + elseif issue.member_info.own_delegation_scope == "area" then 1.183 + ui.heading{ level = 3, content = _"You delegated this subject area" } 1.184 + elseif issue.member_info.own_delegation_scope == "issue" then 1.185 + ui.heading{ level = 3, content = _"You delegated this issue" } 1.186 + end 1.187 + 1.188 + ui.tag { tag = "ul", attr = { class = "ul" }, content = function () 1.189 + if issue.member_info.own_delegation_scope == "area" or 1.190 + issue.member_info.own_delegation_scope == "unit" then 1.191 + ui.tag { tag = "li", content = function () 1.192 + ui.link { 1.193 + module = "delegation", view = "show", params = { 1.194 + issue_id = issue.id, 1.195 + initiative_id = initiative and initiative.id or nil 1.196 + }, 1.197 + content = _"change/revoke delegation only for this issue" 1.198 + } 1.199 + end } 1.200 + end 1.201 + if issue.member_info.own_delegation_scope == "unit" then 1.202 + ui.tag { tag = "li", content = function () 1.203 + ui.link { 1.204 + module = "delegation", view = "show", params = { 1.205 + unit_id = issue.area.unit_id, 1.206 + }, 1.207 + content = _("change/revoke delegation of organizational unit", { 1.208 + unit_name = issue.area.unit.name 1.209 + }) 1.210 + } 1.211 + end } 1.212 + elseif issue.member_info.own_delegation_scope == "area" then 1.213 + ui.tag { tag = "li", content = function () 1.214 + ui.link { 1.215 + module = "delegation", view = "show", params = { 1.216 + area_id = issue.area_id, 1.217 + }, 1.218 + content = _"change/revoke delegation of subject area" 1.219 + } 1.220 + end } 1.221 + end 1.222 + if issue.member_info.own_delegation_scope == nil then 1.223 + ui.tag { tag = "li", content = function () 1.224 + ui.link { 1.225 + module = "delegation", view = "show", params = { 1.226 + issue_id = issue.id, 1.227 + initiative_id = initiative and initiative.id or nil 1.228 + }, 1.229 + content = _"choose issue delegatee" 1.230 + } 1.231 + end } 1.232 + elseif issue.member_info.own_delegation_scope == "issue" then 1.233 + ui.tag { tag = "li", content = function () 1.234 + ui.link { 1.235 + module = "delegation", view = "show", params = { 1.236 + issue_id = issue.id, 1.237 + initiative_id = initiative and initiative.id or nil 1.238 + }, 1.239 + content = _"change/revoke issue delegation" 1.240 + } 1.241 + end } 1.242 + end 1.243 + end } 1.244 + 1.245 + if issue.member_info.first_trustee_id and issue.member_info.own_participation then 1.246 + local text = _"As long as you are interested in this issue yourself, the delegation is suspended for this issue, but it will be applied again in the voting phase unless you vote yourself." 1.247 + if issue.state == "voting" then 1.248 + text = _"This delegation is suspended, because you voted yourself." 1.249 + end 1.250 + ui.container { content = text } 1.251 + end 1.252 + end ) 1.253 + end 1.254 + 1.255 + if privileged_to_vote and not issue.closed and not issue.fully_frozen then 1.256 + if issue.member_info.own_participation then 1.257 + ui.sidebarSection( function () 1.258 + ui.container{ attr = { class = "right" }, content = function() 1.259 + ui.image{ attr = { class = "right" }, static = "icons/48/eye.png" } 1.260 + if issue.member_info.weight and issue.member_info.weight > 1 then 1.261 + slot.put("<br />") 1.262 + ui.tag{ 1.263 + attr = { class = "right" }, 1.264 + content = "+" .. issue.member_info.weight - 1 1.265 + } 1.266 + end 1.267 + end } 1.268 + ui.heading{ level = 3, content = _("You are interested in this issue", { id = issue.id }) } 1.269 + ui.tag { tag = "ul", attr = { class = "ul" }, content = function () 1.270 + if issue.member_info.weight and issue.member_info.weight > 1 then 1.271 + ui.tag { tag = "li", content = function () 1.272 + ui.link { 1.273 + module = "delegation", view = "show_incoming", 1.274 + params = { issue_id = issue.id, member_id = app.session.member_id }, 1.275 + content = _("you have #{count} incoming delegations", { 1.276 + count = issue.member_info.weight - 1 1.277 + }) 1.278 + } 1.279 + end } 1.280 + end 1.281 + ui.tag { tag = "li", content = function () 1.282 + ui.link { 1.283 + module = "interest", action = "update", 1.284 + routing = { default = { 1.285 + mode = "redirect", module = view_module, view = "show", id = view_id 1.286 + } }, 1.287 + params = { issue_id = issue.id, delete = true }, 1.288 + text = _"remove my interest" 1.289 + } 1.290 + end } 1.291 + end } 1.292 + end ) 1.293 + else 1.294 + ui.sidebarSection( function () 1.295 + ui.heading{ level = 3, content = _("I want to participate in this issue", { id = issue.id }) } 1.296 + ui.tag { tag = "ul", attr = { class = "ul" }, content = function () 1.297 + ui.tag { tag = "li", content = function () 1.298 + ui.link { 1.299 + module = "interest", action = "update", 1.300 + params = { issue_id = issue.id }, 1.301 + routing = { default = { 1.302 + mode = "redirect", module = view_module, view = "show", id = view_id 1.303 + } }, 1.304 + text = _"add my interest" 1.305 + } 1.306 + end } 1.307 + ui.tag { tag = "li", content = _"browse through the competing initiatives" } 1.308 + end } 1.309 + end ) 1.310 + end 1.311 + 1.312 + if initiative then 1.313 + 1.314 + if not initiative.member_info.supported or active_trustee_id then 1.315 + ui.container { attr = { class = "sidebarRow" }, content = function () 1.316 + ui.heading { level = 3, content = function() 1.317 + ui.tag { content = _"I like this initiative and I want to support it" } 1.318 + end } 1.319 + ui.tag { tag = "ul", attr = { class = "ul" }, content = function () 1.320 + ui.tag { tag = "li", content = function () 1.321 + ui.link { 1.322 + module = "initiative", action = "add_support", 1.323 + routing = { default = { 1.324 + mode = "redirect", module = "initiative", view = "show", id = initiative.id 1.325 + } }, 1.326 + id = initiative.id, 1.327 + text = _"add my support" 1.328 + } 1.329 + end } 1.330 + end } 1.331 + end } 1.332 + 1.333 + else -- if not supported 1.334 + ui.container { attr = { class = "sidebarRow" }, content = function () 1.335 + if initiative.member_info.satisfied then 1.336 + ui.image{ attr = { class = "right icon48" }, static = "icons/32/support_satisfied.png" } 1.337 + else 1.338 + ui.image{ attr = { class = "right icon48" }, static = "icons/32/support_unsatisfied.png" } 1.339 + end 1.340 + ui.heading { level = 3, content = _"You are supporting this initiative" } 1.341 + ui.tag { tag = "ul", attr = { class = "ul" }, content = function () 1.342 + if not initiative.member_info.satisfied then 1.343 + ui.tag { tag = "li", content = function () 1.344 + ui.tag { content = function () 1.345 + ui.link { 1.346 + external = "#suggestions", 1.347 + content = _"you restricted your support by rating suggestions as must or must not" 1.348 + } 1.349 + end } 1.350 + end } 1.351 + end 1.352 + ui.tag { tag = "li", content = function () 1.353 + ui.tag { content = function () 1.354 + ui.link { 1.355 + xattr = { class = "btn btn-remove" }, 1.356 + module = "initiative", action = "remove_support", 1.357 + routing = { default = { 1.358 + mode = "redirect", module = "initiative", view = "show", id = initiative.id 1.359 + } }, 1.360 + id = initiative.id, 1.361 + text = _"remove my support" 1.362 + } 1.363 + end } 1.364 + end } 1.365 + end } 1.366 + end } 1.367 + 1.368 + end -- not supported 1.369 + 1.370 + ui.container { attr = { class = "sidebarRow" }, content = function () 1.371 + ui.heading { level = 3, content = _"I want to improve this initiative" } 1.372 + ui.tag { tag = "ul", attr = { class = "ul" }, content = function () 1.373 + if issue.state == "verification" then 1.374 + ui.tag { tag = "li", content = _"this issue is in verification phase, therefore the initiative text cannot be updated anymore" } 1.375 + elseif issue.state == "voting" then 1.376 + ui.tag { tag = "li", content = _"this issue is in voting phase, therefore the initiative text cannot be updated anymore" } 1.377 + else 1.378 + 1.379 + if initiative.member_info.initiated then 1.380 + ui.tag { tag = "li", content =_"take a look at the suggestions of your supporters" } 1.381 + ui.tag { tag = "li", content =_"if you like to implement a suggestion in your proposal and/or reasons, update your initiative draft" } 1.382 + ui.tag { tag = "li", content =_"to argue about suggestions, just add your arguments to your reasons in the initiative draft, so your supporters can learn about your opinion" } 1.383 + end 1.384 + 1.385 + if not initiative.member_info.supported or active_trustee_id then 1.386 + ui.tag { tag = "li", content =_"add your support (see above) and rate or write new suggestions (and thereby restrict your support to certain conditions if necessary)" } 1.387 + else 1.388 + ui.tag { tag = "li", content = _"take a look at the suggestions (see left) and rate them" } 1.389 + ui.tag { tag = "li", content = function () 1.390 + ui.link { 1.391 + module = "suggestion", view = "new", params = { 1.392 + initiative_id = initiative.id 1.393 + }, 1.394 + content = _"write a new suggestion" 1.395 + } 1.396 + end } 1.397 + end 1.398 + end 1.399 + end } 1.400 + end } 1.401 + 1.402 + end 1.403 + 1.404 + if 1.405 + (issue.state == "admission" or 1.406 + issue.state == "discussion" or 1.407 + issue.state == "verification") 1.408 + then 1.409 + ui.sidebarSection( function () 1.410 + if initiative then 1.411 + ui.heading{ level = 3, content = _"I don't like this initiative and I want to add my opinion or counter proposal" } 1.412 + else 1.413 + ui.heading{ level = 3, content = _"I don't like any of the initiative in this issue and I want to add my opinion or counter proposal" } 1.414 + end 1.415 + ui.tag { tag = "ul", attr = { class = "ul" }, content = function () 1.416 + ui.tag { tag = "li", content = function () 1.417 + ui.link { 1.418 + module = "issue", view = "show", id = issue.id, 1.419 + content = _"take a look at the competing initiatives" 1.420 + } 1.421 + end } 1.422 + ui.tag { tag = "li", content = function () 1.423 + ui.link { 1.424 + module = "initiative", view = "new", 1.425 + params = { issue_id = issue.id }, 1.426 + content = _"start a new competing initiative" 1.427 + } 1.428 + end } 1.429 + end } 1.430 + end ) 1.431 + end 1.432 + 1.433 + if not issue.member_info.first_trustee_id then 1.434 + ui.sidebarSection( function () 1.435 + ui.heading{ level = 3, content = _"I want to delegate this issue" } 1.436 + 1.437 + ui.tag { tag = "ul", attr = { class = "ul" }, content = function () 1.438 + ui.tag { tag = "li", content = function () 1.439 + ui.link { 1.440 + module = "delegation", view = "show", params = { 1.441 + issue_id = issue.id, 1.442 + initiative_id = initiative and initiative.id or nil 1.443 + }, 1.444 + content = _"choose issue delegatee" 1.445 + } 1.446 + end } 1.447 + end } 1.448 + end ) 1.449 + end 1.450 + 1.451 + end 1.452 + 1.453 + if initiator and initiator.accepted == false then 1.454 + ui.container { attr = { class = "sidebarRow" }, content = function () 1.455 + ui.heading { level = 3, content = function() 1.456 + ui.tag { content = _"You refused to become initiator of this initiative" } 1.457 + end } 1.458 + ui.tag { tag = "ul", attr = { class = "ul" }, content = function () 1.459 + ui.tag{ tag = "li", content = function () 1.460 + ui.link{ 1.461 + text = _"allow invitation again", 1.462 + module = "initiative", 1.463 + action = "remove_initiator", 1.464 + params = { 1.465 + initiative_id = initiative.id, 1.466 + member_id = app.session.member.id 1.467 + }, 1.468 + routing = { 1.469 + ok = { 1.470 + mode = "redirect", 1.471 + module = "initiative", 1.472 + view = "show", 1.473 + id = initiative.id 1.474 + } 1.475 + } 1.476 + } 1.477 + end } 1.478 + end } 1.479 + end } 1.480 + end 1.481 + 1.482 + 1.483 + 1.484 + if privileged_to_vote then 1.485 + 1.486 + if initiative and 1.487 + (issue.state == "admission" or 1.488 + issue.state == "discussion" or 1.489 + issue.state == "verification") 1.490 + then 1.491 + 1.492 + elseif issue.state == "verification" then 1.493 + 1.494 + elseif issue.state == "voting" then 1.495 + if not issue.member_info.direct_voted then 1.496 + if not issue.member_info.non_voter then 1.497 + ui.container { attr = { class = "sidebarRow" }, content = function () 1.498 + ui.heading { level = 3, content = _"I like to vote on this issue:" } 1.499 + ui.tag { tag = "ul", attr = { class = "ul" }, content = function () 1.500 + ui.tag { tag = "li", content = function () 1.501 + ui.tag { content = function () 1.502 + if not issue.closed then 1.503 + ui.link { 1.504 + xattr = { class = "btn btn-vote" }, 1.505 + module = "vote", view = "list", 1.506 + params = { issue_id = issue.id }, 1.507 + text = _"vote now" 1.508 + } 1.509 + end 1.510 + end } 1.511 + end } 1.512 + end } 1.513 + end } 1.514 + end 1.515 + ui.container { attr = { class = "sidebarRow" }, content = function () 1.516 + if not issue.member_info.non_voter then 1.517 + ui.heading { level = 3, content = _"I don't like to vote this issue (myself):" } 1.518 + ui.tag { tag = "ul", attr = { class = "ul" }, content = function () 1.519 + ui.tag { tag = "li", content = function () 1.520 + ui.link{ 1.521 + content = _"do not notify me about this voting anymore", 1.522 + module = "vote", 1.523 + action = "non_voter", 1.524 + params = { issue_id = issue.id }, 1.525 + routing = { 1.526 + default = { 1.527 + mode = "redirect", 1.528 + module = request.get_module(), 1.529 + view = request.get_view(), 1.530 + id = param.get_id_cgi(), 1.531 + params = param.get_all_cgi() 1.532 + } 1.533 + } 1.534 + } 1.535 + end } 1.536 + end } 1.537 + else 1.538 + ui.heading { level = 3, content = _"You do not like to vote this issue (yourself)" } 1.539 + ui.tag { tag = "ul", attr = { class = "ul" }, content = function () 1.540 + ui.tag { tag = "li", content = function () 1.541 + ui.link{ 1.542 + in_brackets = true, 1.543 + content = _"discard", 1.544 + module = "vote", 1.545 + action = "non_voter", 1.546 + params = { issue_id = issue.id, delete = true }, 1.547 + routing = { 1.548 + default = { 1.549 + mode = "redirect", 1.550 + module = request.get_module(), 1.551 + view = request.get_view(), 1.552 + id = param.get_id_cgi(), 1.553 + params = param.get_all_cgi() 1.554 + } 1.555 + } 1.556 + } 1.557 + end } 1.558 + end } 1.559 + end 1.560 + end } 1.561 + else 1.562 + ui.container { attr = { class = "sidebarRow" }, content = function () 1.563 + ui.heading { level = 3, content = _"I like to change/revoke my vote:" } 1.564 + ui.tag { tag = "ul", attr = { class = "ul" }, content = function () 1.565 + ui.tag { tag = "li", content = function () 1.566 + ui.tag { content = function () 1.567 + if not issue.closed then 1.568 + ui.link { 1.569 + xattr = { class = "btn btn-vote" }, 1.570 + module = "vote", view = "list", 1.571 + params = { issue_id = issue.id }, 1.572 + text = _"change my vote" 1.573 + } 1.574 + end 1.575 + end } 1.576 + end } 1.577 + ui.tag { tag = "li", content = function () 1.578 + ui.tag { content = function () 1.579 + if not issue.closed then 1.580 + ui.link { 1.581 + module = "vote", action = "update", 1.582 + params = { 1.583 + issue_id = issue.id, 1.584 + discard = true 1.585 + }, 1.586 + routing = { 1.587 + default = { 1.588 + mode = "redirect", 1.589 + module = "issue", 1.590 + view = "show", 1.591 + id = issue.id 1.592 + } 1.593 + }, 1.594 + text = _"discard my vote" 1.595 + } 1.596 + end 1.597 + end } 1.598 + end } 1.599 + end } 1.600 + 1.601 + end } 1.602 + 1.603 + end 1.604 + end 1.605 + end 1.606 + 1.607 + if app.session.member and not privileged_to_vote then 1.608 + ui.sidebarSection( _"You are not entitled to vote in this unit" ) 1.609 + end 1.610 + 1.611 + if issue.closed then 1.612 + ui.container { attr = { class = "sidebarRow" }, content = function () 1.613 + ui.heading { level = 3, content = _"This issue is closed" } 1.614 + end } 1.615 + end 1.616 + 1.617 + if initiative and config.tell_others and config.tell_others.initiative then 1.618 + ui.container { attr = { class = "sidebarRow" }, content = function () 1.619 + 1.620 + ui.heading { level = 3, content = _"Tell others about this initiative:" } 1.621 + ui.tag { tag = "ul", attr = { class = "ul" }, content = function () 1.622 + 1.623 + for i, link in ipairs (config.tell_others.initiative(initiative)) do 1.624 + ui.tag { tag = "li", content = function () 1.625 + ui.link ( link ) 1.626 + end } 1.627 + end 1.628 + 1.629 + end } 1.630 + end } 1.631 + end 1.632 + 1.633 + 1.634 +end )