Программа переведена на новый конфиг

This commit is contained in:
Sergey 2019-09-10 19:06:48 +03:00
parent 2420f0b038
commit 8a5a586a73
5 changed files with 166 additions and 100 deletions

View File

@ -45,3 +45,4 @@ localhost:1545 {
} }

View File

@ -23,6 +23,33 @@ proc GetInfobasePassword {host cluster infobase} {
} }
} }
proc GetClusterAdmin {host cluster} {
global servers_list
if [dict exists $servers_list servers $host clusters $cluster cluster_user] {
return [dict get $servers_list servers $host clusters $cluster cluster_user]
}
}
proc GetClusterPassword {host cluster} {
global servers_list
if [dict exists $servers_list servers $host clusters $cluster cluster_pwd] {
return [dict get $servers_list servers $host clusters $cluster cluster_pwd]
}
}
proc GetAgentAdmin {host} {
global servers_list
if [dict exists $servers_list servers $host agent_user] {
return [dict get $servers_list servers $host agent_user]
}
}
proc GetAgentPassword {host} {
global servers_list
if [dict exists $servers_list servers $host agent_pwd] {
return [dict get $servers_list servers $host agent_pwd]
}
}
# Конвертация словаря в удобочитаемый формат # Конвертация словаря в удобочитаемый формат
@ -61,6 +88,11 @@ proc dict2json {dictionary} {
} }
proc SetServersConfigDict {} {
global servers_list
}
# Сохраянем конфиг # Сохраянем конфиг
proc SaveConfig {} { proc SaveConfig {} {
global dir servers_list global dir servers_list
@ -69,10 +101,12 @@ proc SaveConfig {} {
set dict [dict get $servers_list servers] set dict [dict get $servers_list servers]
#puts "\n\n[split $dict " "]\n\n" #puts "\n\n[split $dict " "]\n\n"
set dict [string map {"\{" "\{\n" "\}" "\n\}"} $dict] set dict [string map {"\{" "\{\n" "\}" "\n\}"} $dict]
regsub -- {(\} )} $dict "\}\n" dict regsub -- {(\})} $dict "\}\n" dict
puts "_________"
#puts $dict puts $servers_list
#DictFormatter [dict get $servers_list servers] "-" puts "2_________"
puts $dict
#ictFormatter [dict get $servers_list servers] "-"
#DictFormatter $dict "-" #DictFormatter $dict "-"
#regexp -all -indices -line -- {\}(.+?)\{} $dict m #regexp -all -indices -line -- {\}(.+?)\{} $dict m
#puts " \n $m" #puts " \n $m"
@ -90,13 +124,13 @@ proc SaveConfig {} {
if {$open_brace == 0} { if {$open_brace == 0} {
append indent "" append indent ""
} else { } else {
append indent " " append indent " "
} }
incr open_brace incr open_brace
} }
if [regexp -- {\}} $line] { if [regexp -- {\}} $line] {
#incr open_brace -1 #incr open_brace -1
set indent [string range $indent 0 end-2] set indent [string range $indent 0 end-4]
incr close_brace incr close_brace
} }
if [regexp -nocase -all -- {(\})(.+?\{)} $line match brace phrase] { if [regexp -nocase -all -- {(\})(.+?\{)} $line match brace phrase] {
@ -123,6 +157,15 @@ proc SaveConfig {} {
append str $indent [string trim $line] "\n" append str $indent [string trim $line] "\n"
} }
puts $f $str puts $f $str
close $f
set file [open [file join $dir(work) 1c_srv_new.cfg] "w"]
set f [open [file join $dir(work) 1c_srv_new_.cfg] "r"]
while {[gets $f line] >=0} {
if {$line ne ""} {
puts $file $line
}
}
#file copy -force [file join $dir(work) 1c_srv_new_.cfg] [file join $dir(work) 1c_srv_new.cfg]
} }
proc GetDictFromString {str indent} { proc GetDictFromString {str indent} {
@ -178,3 +221,8 @@ proc CopyNewConfig {} {
} }
} }

View File

@ -32,37 +32,37 @@ proc TreePress {tree} {
} }
proc SetGlobalVarFromTreeItems {tree id} { proc SetGlobalVarFromTreeItems {tree id} {
global host server active_cluster infobase profile_name dir rac_cmd_for_host rac_cmd global host server active_cluster infobase profile_name dir rac_cmd_for_host rac_cmd servers_list \
cluster_user cluster_pwd agent_user agent_pwd
set parent [$tree parent $id] set parent [$tree parent $id]
set values [$tree item $id -values] set values [$tree item $id -values]
set key [lindex [split $id "::"] 0] set key [lindex [split $id "::"] 0]
puts "$parent $values $key"
switch -- $key { switch -- $key {
server { server {
set host $values set host $values
set orig_file [open [file join $dir(work) 1c_srv.cfg] "r"] set rac_cmd_for_host($host) [dict get $servers_list servers $host rac_cmd]
while {[gets $orig_file line] >=0 } { }
if [string match "$host*" $line] { work_server {
set path_to_rac [string trim [lindex [split $line ","] 1]] set server $values
if {$path_to_rac eq ""} {
set rac_cmd_for_host($host) "$rac_cmd"
} else {
set rac_cmd_for_host($host) $path_to_rac
set rac_cmd $path_to_rac
}
}
}
close $orig_file
} }
work_server {set server $values}
cluster { cluster {
set active_cluster $values set active_cluster $values
#dict set servers_list $host $values #dict set servers_list servers $host clusters "$values {}"
set cluster_user [GetClusterAdmin $host $active_cluster]
set cluster_pwd [GetClusterPassword $host $active_cluster]
} }
infobase { infobase {
set infobase $values set infobase $values
#dict set servers_list $host $active_cluster infobases $values #dict set servers_list servers $host clusters $active_cluster infobases $values
}
profile {
set profile_name $values
}
agent_admins {
set agent_user [GetAgentAdmin $host]
set agent_pwd [GetAgentPassword $host]
} }
profile {set profile_name $values}
} }
if {$parent eq ""} { if {$parent eq ""} {
@ -146,7 +146,7 @@ proc RunCommand {par} {
} }
proc ErrorParcing {err opt} { proc ErrorParcing {err opt} {
global cluster_user cluster_pwd agent_user agent_pwd global cluster_user cluster_pwd agent_user agent_pwd servers_list
switch -regexp -- $err { switch -regexp -- $err {
"Cluster administrator is not authenticated" { "Cluster administrator is not authenticated" {
@ -189,7 +189,7 @@ proc ErrorParcing {err opt} {
} }
} }
proc AuthorisationDialog {txt} { proc AuthorisationDialog {txt} {
global active_cluster agent_user agent_pwd cluster_user cluster_pwd global active_cluster agent_user agent_pwd cluster_user cluster_pwd servers_list
.frm_work.tree_work delete [ .frm_work.tree_work children {}] .frm_work.tree_work delete [ .frm_work.tree_work children {}]
set frm [AddToplevel "$txt" administrator_grey_64 .auth_win] set frm [AddToplevel "$txt" administrator_grey_64 .auth_win]
@ -383,7 +383,25 @@ proc SetRacCommand {} {
if {$rac_cmd eq ""} { if {$rac_cmd eq ""} {
return return
} else { } else {
return $rac_cmd #puts $rac_cmd
if {[file tail $rac_cmd] ne "rac" && [file tail $rac_cmd] ne "rac.exe"} {
set rac [file tail $rac_cmd]
set path_to_rac [file rootname $rac_cmd]
append msg [::msgcat::mc "Command must be"] " 'rac' " \
[::msgcat::mc "or"] " 'rac.exe'\n" \
[::msgcat::mc "You entered"] " '$rac' - " \
[::msgcat::mc "it's correct?"]
set answer [tk_messageBox -message [::msgcat::mc $msg] -icon question -type yesno]
switch -- $answer {
yes {
return $rac_cmd
}
no SetRacCommand
}
} else {
return $rac_cmd
}
} }
} }
@ -392,7 +410,7 @@ namespace eval Run {} {}
# Получение данных по кластерам # Получение данных по кластерам
proc Run::server {tree host values} { proc Run::server {tree host values} {
global rac_cmd_for_host rac_cmd global rac_cmd_for_host rac_cmd servers_list
if {[info exists rac_cmd_for_host($host)] == 1 && $rac_cmd_for_host($host) ne "" } { if {[info exists rac_cmd_for_host($host)] == 1 && $rac_cmd_for_host($host) ne "" } {
set rac_cmd $rac_cmd_for_host($host) set rac_cmd $rac_cmd_for_host($host)
} }
@ -417,10 +435,15 @@ proc Run::server {tree host values} {
} }
foreach x [array names cluster] { foreach x [array names cluster] {
set id [lindex $cluster($x) 0] set id [lindex $cluster($x) 0]
set cluster_name [lindex $cluster($x) 1]
if { [$tree exists "cluster::$id"] == 0 } { if { [$tree exists "cluster::$id"] == 0 } {
$tree insert "server::$host" end -id "cluster::$id" -text "[lindex $cluster($x) 1]" -values "$id" $tree insert "server::$host" end -id "cluster::$id" -text "$cluster_name" -values "$id"
InsertClusterItems $tree $id InsertClusterItems $tree $id
} }
#dict replace servers_list [dict get servers_list servers $host clusters]
#dict set servers_list servers $host clusters $id name $cluster_name
#puts $cluster_name
#puts $servers_list
} }
if { [$tree exists "agent_admins::$id"] == 0 } { if { [$tree exists "agent_admins::$id"] == 0 } {
$tree insert "server::$host" end -id "agent_admins::$id" -text [::msgcat::mc "Administrators"] -values "$id" $tree insert "server::$host" end -id "agent_admins::$id" -text [::msgcat::mc "Administrators"] -values "$id"
@ -478,6 +501,7 @@ proc Run::infobases {tree host values} {
proc Run::infobase {tree host values} { proc Run::infobase {tree host values} {
global active_cluster cluster_user cluster_pwd default servers_list global active_cluster cluster_user cluster_pwd default servers_list
if {$cluster_user ne "" && $cluster_pwd ne ""} { if {$cluster_user ne "" && $cluster_pwd ne ""} {
set auth "--cluster-user=$cluster_user --cluster-pwd=$cluster_pwd" set auth "--cluster-user=$cluster_user --cluster-pwd=$cluster_pwd"
} else { } else {
@ -937,9 +961,11 @@ proc Add::admin {tree host value} {
} }
proc Add::server {} { proc Add::server {} {
global default rac_cmd_for_host global default rac_cmd_for_host servers_list
set frm [AddToplevel [::msgcat::mc "Main server"] server_grey_64] set frm [AddToplevel [::msgcat::mc "Main server"] server_grey_64]
ttk::label $frm.lbl_server_name -text [::msgcat::mc "Name"]
ttk::entry $frm.ent_server_name
ttk::label $frm.lbl_host -text [::msgcat::mc "Address"] ttk::label $frm.lbl_host -text [::msgcat::mc "Address"]
ttk::entry $frm.ent_host ttk::entry $frm.ent_host
ttk::label $frm.lbl_port -text [::msgcat::mc "Port"] ttk::label $frm.lbl_port -text [::msgcat::mc "Port"]
@ -948,13 +974,15 @@ proc Add::server {} {
ttk::entry $frm.ent_path_to_rac ttk::entry $frm.ent_path_to_rac
ttk::button $frm.btn_path_to_rac -text "..." -width 3 ttk::button $frm.btn_path_to_rac -text "..." -width 3
$frm.ent_port insert end $default(port) $frm.ent_port insert end $default(port)
grid $frm.lbl_host -row 0 -column 0 -sticky nsw -padx 5 -pady 5 grid $frm.lbl_server_name -row 0 -column 0 -sticky nsw -padx 5 -pady 5
grid $frm.ent_host -row 0 -column 1 -columnspan 2 -sticky nsew -padx 5 -pady 5 grid $frm.ent_server_name -row 0 -column 1 -columnspan 2 -sticky nsew -padx 5 -pady 5
grid $frm.lbl_port -row 1 -column 0 -sticky nsw -padx 5 -pady 5 grid $frm.lbl_host -row 1 -column 0 -sticky nsw -padx 5 -pady 5
grid $frm.ent_port -row 1 -column 1 -columnspan 2 -sticky nesw -padx 5 -pady 5 grid $frm.ent_host -row 1 -column 1 -columnspan 2 -sticky nsew -padx 5 -pady 5
grid $frm.lbl_path_to_rac -row 2 -column 0 -sticky nsw -padx 5 -pady 5 grid $frm.lbl_port -row 2 -column 0 -sticky nsw -padx 5 -pady 5
grid $frm.ent_path_to_rac -row 2 -column 1 -sticky nsew -padx 5 -pady 5 grid $frm.ent_port -row 2 -column 1 -columnspan 2 -sticky nesw -padx 5 -pady 5
grid $frm.btn_path_to_rac -row 2 -column 2 -sticky new -padx 5 -pady 5 grid $frm.lbl_path_to_rac -row 3 -column 0 -sticky nsw -padx 5 -pady 5
grid $frm.ent_path_to_rac -row 3 -column 1 -sticky nsew -padx 5 -pady 5
grid $frm.btn_path_to_rac -row 3 -column 2 -sticky new -padx 5 -pady 5
grid columnconfigure $frm 0 -weight 1 grid columnconfigure $frm 0 -weight 1
grid rowconfigure $frm 0 -weight 1 grid rowconfigure $frm 0 -weight 1
@ -964,17 +992,25 @@ proc Add::server {} {
} }
.add.frm_btn.btn_ok configure -command { .add.frm_btn.btn_ok configure -command {
set host [SaveMainServer [.add.frm.ent_host get] [.add.frm.ent_port get] [.add.frm.ent_path_to_rac get]] set server_name "[.add.frm.ent_server_name get]"
set host "[.add.frm.ent_host get]:[.add.frm.ent_port get]"
set rac_cmd_for_host($host) [.add.frm.ent_path_to_rac get] set rac_cmd_for_host($host) [.add.frm.ent_path_to_rac get]
.frm_tree.tree insert {} end -id "server::$host" -text "$host" -values "$host"
dict set servers_list servers $host "name \"$server_name\" rac_cmd $rac_cmd_for_host($host) clusters {}"
#set host [SaveMainServer [.add.frm.ent_host get] [.add.frm.ent_port get] [.add.frm.ent_path_to_rac get]]
#set rac_cmd_for_host($host) [.add.frm.ent_path_to_rac get]
#puts $servers_list
.frm_tree.tree insert {} end -id "server::$host" -text "$server_name" -values "$host"
destroy .add destroy .add
SaveConfig
return $host return $host
} }
return $frm return $frm
} }
proc Add::servers {tree host values} { proc Add::servers {tree host values} {
global default dedicate_managers using active_cluster cluster_user cluster_pwd auth \ global default dedicate_managers using active_cluster cluster_user cluster_pwd auth \
servers_list
if {$cluster_user ne "" && $cluster_pwd ne ""} { if {$cluster_user ne "" && $cluster_pwd ne ""} {
set auth "--cluster-user=$cluster_user --cluster-pwd=$cluster_pwd" set auth "--cluster-user=$cluster_user --cluster-pwd=$cluster_pwd"
} else { } else {
@ -1231,7 +1267,9 @@ proc Add::cluster {tree host values} {
set errors_count_threshold $default(errors_count_threshold) set errors_count_threshold $default(errors_count_threshold)
set security_level [lindex $default(security_level) 0] set security_level [lindex $default(security_level) 0]
set load_balancing_mode [lindex $default(load_balancing_mode) 0] set load_balancing_mode [lindex $default(load_balancing_mode) 0]
set kill_problem_processes no
set kill_by_memory_with_dump no
set frm [AddToplevel [::msgcat::mc "Cluster"] cluster_grey_64] set frm [AddToplevel [::msgcat::mc "Cluster"] cluster_grey_64]
ttk::label $frm.lbl_host -text [::msgcat::mc "Host"] ttk::label $frm.lbl_host -text [::msgcat::mc "Host"]
@ -1303,7 +1341,7 @@ proc Add::cluster {tree host values} {
RunCommand "cluster insert \ RunCommand "cluster insert \
--host=[.add.frm.ent_host get] \ --host=[.add.frm.ent_host get] \
--port=[.add.frm.ent_port get] \ --port=[.add.frm.ent_port get] \
--name=[.add.frm.ent_name get] \ --name=[regsub -all -- " " [.add.frm.ent_name get] "\\ "] \
--expiration-timeout=$expiration_timeout \ --expiration-timeout=$expiration_timeout \
--lifetime-limit=$lifetime_limit \ --lifetime-limit=$lifetime_limit \
--max-memory-size=$max_memory_size \ --max-memory-size=$max_memory_size \
@ -1798,53 +1836,37 @@ proc Edit::managers {tree host values} {
} }
proc Edit::server {tree host value} { proc Edit::server {tree host value} {
global dir prev_address rac_cmd rac_cmd_for_host global dir prev_address rac_cmd rac_cmd_for_host servers_list
set frm [Add::server] set frm [Add::server]
wm title .add [::msgcat::mc "Edit record"] wm title .add [::msgcat::mc "Edit record"]
set lst [split $value ":"] set lst [split $value ":"]
set prev_address $value set prev_address $value
set orig_file [open [file join $dir(work) 1c_srv.cfg] "r"] .add.frm.ent_server_name delete 0 end
while {[gets $orig_file line] >=0 } {
if [string match "$prev_address*" $line] {
set path_to_rac [string trim [lindex [split $line ","] 1]]
if {$path_to_rac eq ""} {
set path_to_rac "$rac_cmd"
}
}
}
close $orig_file
.add.frm.ent_host delete 0 end .add.frm.ent_host delete 0 end
.add.frm.ent_port delete 0 end .add.frm.ent_port delete 0 end
.add.frm.ent_path_to_rac delete 0 end .add.frm.ent_path_to_rac delete 0 end
.add.frm.ent_server_name insert end [dict get $servers_list servers $prev_address name]
.add.frm.ent_host insert end [lindex $lst 0] .add.frm.ent_host insert end [lindex $lst 0]
.add.frm.ent_port insert end [lindex $lst 1] .add.frm.ent_port insert end [lindex $lst 1]
.add.frm.ent_path_to_rac insert end $path_to_rac .add.frm.ent_path_to_rac insert end [dict get $servers_list servers $prev_address rac_cmd]
.add.frm_btn.btn_ok configure -command { .add.frm_btn.btn_ok configure -command {
set host "[.add.frm.ent_host get]:[.add.frm.ent_port get]" set host "[.add.frm.ent_host get]:[.add.frm.ent_port get]"
#set rac_cmd [.add.frm.ent_path_to_rac get] set server_name [.add.frm.ent_server_name get]
set rac_cmd_for_host($host) [.add.frm.ent_path_to_rac get] set rac_cmd_for_host($host) [.add.frm.ent_path_to_rac get]
.frm_tree.tree delete "server::$prev_address" .frm_tree.tree delete "server::$prev_address"
.frm_work.tree_work delete [ .frm_work.tree_work children {}] .frm_work.tree_work delete [ .frm_work.tree_work children {}]
.frm_tree.tree insert {} end -id "server::$host" -text "$host" -values "$host" .frm_tree.tree insert {} end -id "server::$host" -text "$server_name" -values "$host"
if [file exists [file join $dir(work) 1c_srv.cfg.bak]] {
file delete [file join $dir(work) 1c_srv.cfg.bak] set clusters [dict get $servers_list servers $prev_address clusters]
} dict unset servers_list servers $prev_address
file copy [file join $dir(work) 1c_srv.cfg] [file join $dir(work) 1c_srv.cfg.bak] dict set servers_list servers $host "name \"$server_name\" rac_cmd $rac_cmd_for_host($host) clusters \{$clusters\}"
set orig_file [open [file join $dir(work) 1c_srv.cfg.bak] "r"] unset clusters server_name
set file [open [file join $dir(work) 1c_srv.cfg] "w"] #puts $servers_list
while {[gets $orig_file line] >=0 } {
if [string match "$prev_address*" $line] {
puts $file "$host,$rac_cmd_for_host($host)"
} else {
puts $file $line
}
}
close $file
close $orig_file
#return "$host:$port"
file delete [file join $dir(work) 1c_srv.cfg.bak]
destroy .add destroy .add
SaveConfig
return $host return $host
} }
} }
@ -2396,6 +2418,7 @@ proc Del::sessions {tree host values} {
} }
proc Del::rule {tree host values} { proc Del::rule {tree host values} {
global active_cluster server agent_user agent_pwd cluster_user cluster_pwd auth global active_cluster server agent_user agent_pwd cluster_user cluster_pwd auth
if {$cluster_user ne "" && $cluster_pwd ne ""} { if {$cluster_user ne "" && $cluster_pwd ne ""} {
@ -2420,14 +2443,20 @@ proc Del::rule {tree host values} {
no {return} no {return}
} }
} }
# Удаление основного сервера кластера
proc Del::server {tree host values} { proc Del::server {tree host values} {
global dir global dir servers_list
set answer [tk_messageBox -message "[::msgcat::mc "Delete server"] $values?" \ set answer [tk_messageBox -message "[::msgcat::mc "Delete server"] $values?" \
-icon question -type yesno ] -icon question -type yesno ]
switch -- $answer { switch -- $answer {
yes { yes {
file copy [file join $dir(work) 1c_srv.cfg] [file join $dir(work) 1c_srv.cfg.bak] dict unset servers_list servers $values
SaveConfig
$tree delete "server::$values"
.frm_work.tree_work delete [ .frm_work.tree_work children {}]
return
# данный код не используется. УДАЛИТЬ!
file copy [file join $dir(work) 1c_srv_new.cfg] [file join $dir(work) 1c_srv.cfg.bak]
set orig_file [open [file join $dir(work) 1c_srv.cfg.bak] "r"] set orig_file [open [file join $dir(work) 1c_srv.cfg.bak] "r"]
set file [open [file join $dir(work) 1c_srv.cfg] "w"] set file [open [file join $dir(work) 1c_srv.cfg] "w"]
while {[gets $orig_file line] >=0 } { while {[gets $orig_file line] >=0 } {
@ -2437,10 +2466,10 @@ proc Del::server {tree host values} {
} }
close $file close $file
close $orig_file close $orig_file
#return "$host:$port"
$tree delete "server::$values"
.frm_work.tree_work delete [ .frm_work.tree_work children {}]
file delete [file join $dir(work) 1c_srv.cfg.bak] file delete [file join $dir(work) 1c_srv.cfg.bak]
#return "$host:$port"
########## Конец Удаления #############
} }
no {return} no {return}
} }
@ -2545,3 +2574,4 @@ proc Del::inet {tree host profile_name} {

View File

@ -122,10 +122,6 @@ set default(temporary_allowed_total_memory) 0
# предел превышения (секунд) допустимого объема памяти процессов <seconds> # предел превышения (секунд) допустимого объема памяти процессов <seconds>
set default(temporary_allowed_total_memory_time_limit) 300 set default(temporary_allowed_total_memory_time_limit) 300
## Раскоментировать строки и прописать свои значения если ## Раскоментировать строки и прописать свои значения если
## для Информационных Баз используются эти параметры ## для Информационных Баз используются эти параметры
#set default(infobase_user) "ib_user" #set default(infobase_user) "ib_user"
@ -137,3 +133,4 @@ set default(theme) dark

View File

@ -84,31 +84,21 @@ CheckVariablesSet
# Читаем файл со списком серверов 1С # Читаем файл со списком серверов 1С
#set serversList [dict create servers] #set serversList [dict create servers]
if [file exists [file join $dir(work) 1c_srv.cfg]] {
set f [open [file join $dir(work) 1c_srv.cfg] "RDONLY"]
while {[gets $f line] >=0} {
set l [split $line ","]
set host [lindex $l 0]
if {[lindex $l 1] ne ""} {
set rac_cmd_for_host($host) [lindex $l 1]
}
.frm_tree.tree insert {} end -id "server::$host" -text "$host" -values "$host"
}
close $f
}
if [file exists [file join $dir(work) 1c_srv_new.cfg]] { if [file exists [file join $dir(work) 1c_srv_new.cfg]] {
set f_new [open [file join $dir(work) 1c_srv_new.cfg] "RDONLY"] set f_new [open [file join $dir(work) 1c_srv_new.cfg] "RDONLY"]
while {[gets $f_new line] >=0} { while {[gets $f_new line] >=0} {
append str " [string trim $line]" append str " [string trim $line]"
} }
set str [string map {"\{ " "\{" " \}" "\}"} $str] set str [string map {"\{ " "\{" " \}" "\}"} $str]
close $f
dict set servers_list servers $str dict set servers_list servers $str
close $f_new
puts $servers_list puts $servers_list
puts [dict get $servers_list servers]
dict for {host host_data} [dict get $servers_list servers] {
.frm_tree.tree insert {} end -id "server::$host" -text [dict get $host_data name] -values "$host"
set rac_cmd_for_host($host) [dict get $host_data rac_cmd]
}
} }