2017-04-25 14:41:48 +02:00
|
|
|
# Text helper window
|
|
|
|
|
|
|
|
|
|
set textdefaults [dict create \
|
|
|
|
|
text "" \
|
|
|
|
|
font "FreeSans" \
|
|
|
|
|
size "1" \
|
|
|
|
|
just "center" \
|
|
|
|
|
rotate "0" \
|
|
|
|
|
offset "0 0" \
|
|
|
|
|
port "0" \
|
|
|
|
|
]
|
2020-05-23 23:13:14 +02:00
|
|
|
|
2017-04-25 14:41:48 +02:00
|
|
|
proc magic::make_texthelper { mgrpath } {
|
|
|
|
|
global typedflt typesticky typeport
|
|
|
|
|
toplevel ${mgrpath}
|
|
|
|
|
wm withdraw ${mgrpath}
|
|
|
|
|
|
|
|
|
|
frame ${mgrpath}.title
|
|
|
|
|
frame ${mgrpath}.text
|
|
|
|
|
frame ${mgrpath}.font
|
|
|
|
|
frame ${mgrpath}.size
|
|
|
|
|
frame ${mgrpath}.just
|
|
|
|
|
frame ${mgrpath}.rotate
|
|
|
|
|
frame ${mgrpath}.offset
|
|
|
|
|
frame ${mgrpath}.layer
|
|
|
|
|
frame ${mgrpath}.port
|
|
|
|
|
|
|
|
|
|
frame ${mgrpath}.buttonbar
|
|
|
|
|
|
|
|
|
|
label ${mgrpath}.title.tlab -text "New label: "
|
|
|
|
|
|
|
|
|
|
label ${mgrpath}.text.tlab -text "Text string: "
|
|
|
|
|
label ${mgrpath}.font.tlab -text "Font: "
|
|
|
|
|
label ${mgrpath}.size.tlab -text "Size (um): "
|
|
|
|
|
label ${mgrpath}.just.tlab -text "Justification: "
|
|
|
|
|
label ${mgrpath}.rotate.tlab -text "Rotation: "
|
|
|
|
|
label ${mgrpath}.offset.tlab -text "Offset from reference: "
|
|
|
|
|
label ${mgrpath}.layer.tlab -text "Attach to layer: "
|
|
|
|
|
label ${mgrpath}.port.tlab -text "Port: "
|
|
|
|
|
|
|
|
|
|
entry ${mgrpath}.text.tent -background white
|
|
|
|
|
entry ${mgrpath}.size.tent -background white
|
|
|
|
|
entry ${mgrpath}.rotate.tent -background white
|
|
|
|
|
entry ${mgrpath}.offset.tent -background white
|
|
|
|
|
entry ${mgrpath}.layer.tent -background white
|
|
|
|
|
entry ${mgrpath}.port.tent -background white
|
|
|
|
|
|
|
|
|
|
set typedflt 1
|
|
|
|
|
set typesticky 0
|
|
|
|
|
set typeport 0
|
|
|
|
|
checkbutton ${mgrpath}.layer.btn1 -text "default" -variable typedflt \
|
|
|
|
|
-command [subst {if {\$typedflt} {pack forget ${mgrpath}.layer.tent \
|
|
|
|
|
} else {pack forget ${mgrpath}.layer.btn2; \
|
|
|
|
|
pack ${mgrpath}.layer.tent -side left -fill x -expand true; \
|
|
|
|
|
pack ${mgrpath}.layer.btn2 -side left}}]
|
|
|
|
|
checkbutton ${mgrpath}.layer.btn2 -text "sticky" -variable typesticky
|
|
|
|
|
checkbutton ${mgrpath}.port.btn -text "enable" -variable typeport \
|
|
|
|
|
-command [subst {if {\$typeport} {
|
|
|
|
|
${mgrpath}.port.tent delete 0 end; \
|
|
|
|
|
${mgrpath}.port.tent insert 0 \[expr {\[port last\] + 1}\]; \
|
|
|
|
|
pack ${mgrpath}.port.tent \
|
|
|
|
|
-side left -fill x -expand true } else { pack forget \
|
|
|
|
|
${mgrpath}.port.tent }}]
|
|
|
|
|
|
|
|
|
|
menubutton ${mgrpath}.just.btn -text "default" -menu ${mgrpath}.just.btn.menu
|
|
|
|
|
menubutton ${mgrpath}.font.btn -text "default" -menu ${mgrpath}.font.btn.menu
|
2020-05-23 23:13:14 +02:00
|
|
|
|
2017-04-25 14:41:48 +02:00
|
|
|
button ${mgrpath}.buttonbar.cancel -text "Cancel" -command "wm withdraw ${mgrpath}"
|
|
|
|
|
button ${mgrpath}.buttonbar.apply -text "Apply"
|
|
|
|
|
button ${mgrpath}.buttonbar.okay -text "Okay"
|
|
|
|
|
|
|
|
|
|
pack ${mgrpath}.title.tlab
|
|
|
|
|
pack ${mgrpath}.text.tlab -side left
|
|
|
|
|
pack ${mgrpath}.text.tent -side right -fill x -expand true
|
|
|
|
|
pack ${mgrpath}.font.tlab -side left
|
|
|
|
|
pack ${mgrpath}.font.btn -side left
|
|
|
|
|
pack ${mgrpath}.size.tlab -side left
|
|
|
|
|
pack ${mgrpath}.size.tent -side right -fill x -expand true
|
|
|
|
|
pack ${mgrpath}.just.tlab -side left
|
|
|
|
|
pack ${mgrpath}.just.btn -side left
|
|
|
|
|
pack ${mgrpath}.rotate.tlab -side left
|
|
|
|
|
pack ${mgrpath}.rotate.tent -side right -fill x -expand true
|
|
|
|
|
pack ${mgrpath}.offset.tlab -side left
|
|
|
|
|
pack ${mgrpath}.offset.tent -side right -fill x -expand true
|
|
|
|
|
pack ${mgrpath}.layer.tlab -side left
|
|
|
|
|
pack ${mgrpath}.layer.btn1 -side left
|
|
|
|
|
pack ${mgrpath}.layer.btn2 -side left
|
|
|
|
|
pack ${mgrpath}.port.tlab -side left
|
|
|
|
|
pack ${mgrpath}.port.btn -side left
|
|
|
|
|
|
|
|
|
|
pack ${mgrpath}.buttonbar.apply -side left
|
|
|
|
|
pack ${mgrpath}.buttonbar.okay -side left
|
|
|
|
|
pack ${mgrpath}.buttonbar.cancel -side right
|
|
|
|
|
|
|
|
|
|
pack ${mgrpath}.title -side top
|
|
|
|
|
pack ${mgrpath}.text -side top -anchor w -expand true
|
|
|
|
|
pack ${mgrpath}.font -side top -anchor w
|
|
|
|
|
pack ${mgrpath}.size -side top -anchor w -expand true
|
|
|
|
|
pack ${mgrpath}.just -side top -anchor w
|
|
|
|
|
pack ${mgrpath}.rotate -side top -anchor w -expand true
|
|
|
|
|
pack ${mgrpath}.offset -side top -anchor w -expand true
|
|
|
|
|
pack ${mgrpath}.layer -side top -anchor w -expand true
|
|
|
|
|
pack ${mgrpath}.port -side top -anchor w -expand true
|
|
|
|
|
pack ${mgrpath}.buttonbar -side bottom -fill x -expand true
|
|
|
|
|
|
|
|
|
|
# Create menus for Font and Justification records
|
|
|
|
|
|
|
|
|
|
menu ${mgrpath}.just.btn.menu -tearoff 0
|
|
|
|
|
menu ${mgrpath}.font.btn.menu -tearoff 0
|
|
|
|
|
|
|
|
|
|
${mgrpath}.just.btn.menu add command -label "default" -command \
|
|
|
|
|
"${mgrpath}.just.btn config -text default"
|
|
|
|
|
${mgrpath}.just.btn.menu add command -label "N" -command \
|
|
|
|
|
"${mgrpath}.just.btn config -text N"
|
|
|
|
|
${mgrpath}.just.btn.menu add command -label "NE" -command \
|
|
|
|
|
"${mgrpath}.just.btn config -text NE"
|
|
|
|
|
${mgrpath}.just.btn.menu add command -label "E" -command \
|
|
|
|
|
"${mgrpath}.just.btn config -text E"
|
|
|
|
|
${mgrpath}.just.btn.menu add command -label "SE" -command \
|
|
|
|
|
"${mgrpath}.just.btn config -text SE"
|
|
|
|
|
${mgrpath}.just.btn.menu add command -label "S" -command \
|
|
|
|
|
"${mgrpath}.just.btn config -text S"
|
|
|
|
|
${mgrpath}.just.btn.menu add command -label "SW" -command \
|
|
|
|
|
"${mgrpath}.just.btn config -text SW"
|
|
|
|
|
${mgrpath}.just.btn.menu add command -label "W" -command \
|
|
|
|
|
"${mgrpath}.just.btn config -text W"
|
|
|
|
|
${mgrpath}.just.btn.menu add command -label "NW" -command \
|
|
|
|
|
"${mgrpath}.just.btn config -text NW"
|
|
|
|
|
${mgrpath}.just.btn.menu add command -label "center" -command \
|
|
|
|
|
"${mgrpath}.just.btn config -text center"
|
|
|
|
|
|
|
|
|
|
set flist [magic::setlabel fontlist]
|
|
|
|
|
${mgrpath}.font.btn.menu add command -label default -command \
|
|
|
|
|
"${mgrpath}.font.btn config -text default"
|
|
|
|
|
foreach i $flist {
|
|
|
|
|
${mgrpath}.font.btn.menu add command -label $i -command \
|
|
|
|
|
"${mgrpath}.font.btn config -text $i"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# Set up tag callbacks
|
|
|
|
|
|
2025-10-08 23:11:27 +02:00
|
|
|
magic::tag add select "magic::update_texthelper"
|
2017-04-25 14:41:48 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# For all editable selected labels, fill in entries in the
|
|
|
|
|
# texthelper window
|
|
|
|
|
|
|
|
|
|
proc magic::analyze_labels {} {
|
|
|
|
|
global typedflt typesticky typeport
|
|
|
|
|
|
|
|
|
|
# Pick up values from the first entry returned
|
|
|
|
|
|
|
|
|
|
set tval [lindex [setlabel text] 0]
|
|
|
|
|
set jval [lindex [setlabel justify] 0]
|
|
|
|
|
set fval [lindex [setlabel font] 0]
|
|
|
|
|
set rval [lindex [setlabel rotate] 0]
|
|
|
|
|
set oval [lindex [setlabel offset] 0]
|
|
|
|
|
set lval [lindex [setlabel layer] 0]
|
|
|
|
|
set kval [lindex [setlabel sticky] 0]
|
2017-12-14 22:05:32 +01:00
|
|
|
set isport [lindex [port exists] 0]
|
|
|
|
|
if {$isport} {
|
|
|
|
|
set pval [lindex [port index] 0]
|
|
|
|
|
} else {
|
|
|
|
|
set pval -1
|
|
|
|
|
}
|
2017-04-25 14:41:48 +02:00
|
|
|
|
|
|
|
|
# Rescale internal units to microns
|
|
|
|
|
set sval [lindex [setlabel size] 0]
|
|
|
|
|
set sscale [cif scale out]
|
|
|
|
|
set tmp_pre $::tcl_precision
|
|
|
|
|
set ::tcl_precision 3
|
|
|
|
|
set sval [expr $sscale * $sval]
|
|
|
|
|
set ::tcl_precision $tmp_pre
|
|
|
|
|
|
|
|
|
|
.texthelper.text.tent delete 0 end
|
|
|
|
|
.texthelper.text.tent insert 0 $tval
|
|
|
|
|
set jbtn [string map {NORTH N WEST W SOUTH S EAST E CENTER center} $jval]
|
|
|
|
|
.texthelper.just.btn.menu invoke $jbtn
|
|
|
|
|
.texthelper.font.btn.menu invoke $fval
|
|
|
|
|
.texthelper.size.tent delete 0 end
|
|
|
|
|
.texthelper.size.tent insert 0 $sval
|
|
|
|
|
.texthelper.offset.tent delete 0 end
|
|
|
|
|
.texthelper.offset.tent insert 0 [join $oval]
|
|
|
|
|
.texthelper.rotate.tent delete 0 end
|
|
|
|
|
.texthelper.rotate.tent insert 0 $rval
|
|
|
|
|
.texthelper.layer.tent delete 0 end
|
|
|
|
|
.texthelper.layer.tent insert 0 $lval
|
|
|
|
|
if {${pval} >= 0} {
|
|
|
|
|
set typeport 1
|
|
|
|
|
.texthelper.port.tent delete 0 end
|
|
|
|
|
.texthelper.port.tent insert 0 $pval
|
|
|
|
|
pack .texthelper.port.tent -side left -fill x -expand true
|
|
|
|
|
} else {
|
|
|
|
|
set typeport 0
|
|
|
|
|
.texthelper.port.tent delete 0 end
|
|
|
|
|
pack forget .texthelper.port.tent
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
set typesticky $kval
|
|
|
|
|
if {$lval == ""} {
|
|
|
|
|
set typedflt 1
|
|
|
|
|
pack forget .texthelper.layer.tent
|
|
|
|
|
} else {
|
|
|
|
|
set typedflt 0
|
|
|
|
|
pack forget .texthelper.layer.btn2
|
|
|
|
|
pack .texthelper.layer.tent -side left -fill x -expand true
|
|
|
|
|
pack .texthelper.layer.btn2 -side left
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
proc magic::change_label {} {
|
|
|
|
|
global typedflt typesticky typeport
|
|
|
|
|
|
|
|
|
|
# Check to see if there really was a selection, or if
|
|
|
|
|
# something got unselected
|
|
|
|
|
|
|
|
|
|
if {[setlabel text] == ""} {
|
|
|
|
|
magic::make_new_label
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
set ltext [.texthelper.text.tent get]
|
|
|
|
|
set lfont [.texthelper.font.btn cget -text]
|
|
|
|
|
set lsize [.texthelper.size.tent get]
|
|
|
|
|
set lrot [.texthelper.rotate.tent get]
|
|
|
|
|
set loff [.texthelper.offset.tent get]
|
|
|
|
|
set ljust [.texthelper.just.btn cget -text]
|
|
|
|
|
set ltype [.texthelper.layer.tent get]
|
|
|
|
|
set lport [.texthelper.port.tent get]
|
|
|
|
|
|
|
|
|
|
if {$ltext != ""} {
|
|
|
|
|
setlabel text $ltext
|
|
|
|
|
}
|
|
|
|
|
if {$lfont != ""} {
|
|
|
|
|
if {$lfont == "default"} {
|
|
|
|
|
setlabel font -1
|
|
|
|
|
} else {
|
|
|
|
|
setlabel font $lfont
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if {$ljust != ""} {
|
|
|
|
|
if {$ljust == "default"} {
|
|
|
|
|
setlabel justify -1
|
|
|
|
|
} else {
|
|
|
|
|
setlabel justify $ljust
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if {$lsize != ""} {
|
|
|
|
|
setlabel size ${lsize}um
|
|
|
|
|
}
|
|
|
|
|
if {$loff != ""} {
|
|
|
|
|
set oldsnap [snap list]
|
|
|
|
|
snap internal
|
|
|
|
|
setlabel offset [join $loff]
|
|
|
|
|
snap $oldsnap
|
|
|
|
|
}
|
|
|
|
|
if {$lrot != ""} {
|
|
|
|
|
setlabel rotate $lrot
|
|
|
|
|
}
|
|
|
|
|
if {$ltype != ""} {
|
|
|
|
|
setlabel layer $ltype
|
|
|
|
|
}
|
|
|
|
|
setlabel sticky $typesticky
|
2017-12-14 22:05:32 +01:00
|
|
|
|
|
|
|
|
if {$typeport == 1 && $lport != ""} {
|
|
|
|
|
if {[port exists] == 0} {
|
|
|
|
|
port make $lport
|
|
|
|
|
} else {
|
|
|
|
|
port index $lport
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
if {[port exists] == 1} {
|
|
|
|
|
port remove
|
|
|
|
|
}
|
|
|
|
|
}
|
2017-04-25 14:41:48 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
proc magic::make_new_label {} {
|
|
|
|
|
global typedflt typesticky textdefaults typeport
|
|
|
|
|
|
|
|
|
|
set ltext [.texthelper.text.tent get]
|
|
|
|
|
set lfont [.texthelper.font.btn cget -text]
|
|
|
|
|
set lsize [.texthelper.size.tent get]
|
|
|
|
|
set lrot [.texthelper.rotate.tent get]
|
|
|
|
|
set loff [.texthelper.offset.tent get]
|
|
|
|
|
set ljust [.texthelper.just.btn cget -text]
|
|
|
|
|
set ltype [.texthelper.layer.tent get]
|
|
|
|
|
set lport [.texthelper.port.tent get]
|
|
|
|
|
|
|
|
|
|
# Apply values back to window defaults
|
|
|
|
|
dict set textdefaults text $ltext
|
|
|
|
|
dict set textdefaults font $lfont
|
|
|
|
|
dict set textdefaults size $lsize
|
|
|
|
|
dict set textdefaults rotate $lrot
|
|
|
|
|
dict set textdefaults offset $loff
|
|
|
|
|
dict set textdefaults just $ljust
|
|
|
|
|
|
|
|
|
|
if {$ltext == ""} return ;# don't generate null label strings!
|
|
|
|
|
|
|
|
|
|
if {$lfont == {} || $lfont == "default"} {
|
|
|
|
|
label $ltext $ljust
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if {$lsize == "0" || $lsize == ""} {set lsize 1}
|
|
|
|
|
if {$lrot == ""} {set lrot 0}
|
|
|
|
|
if {$loff == ""} {set loff "0 0"}
|
|
|
|
|
|
|
|
|
|
if {$typedflt == 1 || $ltype == ""} {
|
|
|
|
|
if {$ljust == "default"} {
|
|
|
|
|
label $ltext $lfont ${lsize}um $lrot [join $loff]
|
|
|
|
|
} else {
|
|
|
|
|
label $ltext $lfont ${lsize}um $lrot [join $loff] $ljust
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
if {$typesticky == 1} {set ltype "-$ltype"}
|
|
|
|
|
if {$ljust == "default"} {
|
|
|
|
|
label $ltext $lfont ${lsize}um $lrot [join $loff] center $ltype
|
|
|
|
|
} else {
|
|
|
|
|
label $ltext $lfont ${lsize}um $lrot [join $loff] $ljust $ltype
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if {$typeport == 1 && $lport != ""} {
|
|
|
|
|
port make $lport
|
2017-12-14 22:05:32 +01:00
|
|
|
# Auto-increment the value to the next available port.
|
|
|
|
|
set pval [port last]
|
|
|
|
|
incr pval
|
|
|
|
|
.texthelper.port.tent delete 0 end
|
|
|
|
|
.texthelper.port.tent insert 0 $pval
|
2017-04-25 14:41:48 +02:00
|
|
|
} else {
|
|
|
|
|
port remove
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# puts stdout "label $ltext $lfont $lsize $lrot $loff $ljust"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#--------------------------------------------------------------------
|
|
|
|
|
# Update and redisplay the text helper
|
|
|
|
|
#--------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
proc magic::update_texthelper {} {
|
|
|
|
|
global CAD_ROOT
|
|
|
|
|
global textdefaults
|
|
|
|
|
|
|
|
|
|
if {[info level] > 1} {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
if {[catch {set tstate [wm state .texthelper]}]} {
|
|
|
|
|
magic::make_texthelper .texthelper
|
|
|
|
|
} else {
|
|
|
|
|
if {$tstate == "withdrawn"} {return}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# Update: Determine if a label has been selected or not. If so,
|
|
|
|
|
# analyze the label list to determine which properties are common
|
|
|
|
|
# to all the selected labels
|
|
|
|
|
|
|
|
|
|
set splist [lindex [what -list] 1]
|
|
|
|
|
|
|
|
|
|
# Reduce list to what's editable
|
|
|
|
|
set slist []
|
|
|
|
|
foreach sitem $splist {
|
2020-05-23 23:13:14 +02:00
|
|
|
set scell [lindex $sitem 2]
|
2017-04-25 14:41:48 +02:00
|
|
|
if {$scell == {}} {
|
|
|
|
|
lappend slist $sitem
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if {$slist == {}} {
|
|
|
|
|
.texthelper.title.tlab configure -text "New label: "
|
|
|
|
|
.texthelper.text.tent delete 0 end
|
|
|
|
|
.texthelper.text.tent insert 0 [dict get $textdefaults text]
|
|
|
|
|
|
|
|
|
|
set deffont [dict get $textdefaults font]
|
|
|
|
|
set found 0
|
|
|
|
|
for {set i 0} {$i <= [.texthelper.font.btn.menu index end]} {incr i} {
|
|
|
|
|
set btnname [.texthelper.font.btn.menu entrycget $i -label]
|
|
|
|
|
if {$btnname == $deffont} {.texthelper.font.btn.menu invoke $i}
|
|
|
|
|
set found 1
|
|
|
|
|
}
|
|
|
|
|
if {$found == 0} {.texthelper.font.btn.menu invoke 0}
|
|
|
|
|
|
|
|
|
|
set defjust [dict get $textdefaults just]
|
|
|
|
|
set found 0
|
|
|
|
|
for {set i 0} {$i <= [.texthelper.just.btn.menu index end]} {incr i} {
|
|
|
|
|
set btnname [.texthelper.just.btn.menu entrycget $i -label]
|
|
|
|
|
if {$btnname == $defjust} {.texthelper.just.btn.menu invoke $i}
|
|
|
|
|
set found 1
|
|
|
|
|
}
|
|
|
|
|
if {$found == 0} {.texthelper.just.btn.menu invoke 0}
|
|
|
|
|
|
|
|
|
|
.texthelper.size.tent delete 0 end
|
|
|
|
|
.texthelper.size.tent insert 0 [dict get $textdefaults size]
|
|
|
|
|
.texthelper.rotate.tent delete 0 end
|
|
|
|
|
.texthelper.rotate.tent insert 0 [dict get $textdefaults rotate]
|
|
|
|
|
.texthelper.offset.tent delete 0 end
|
|
|
|
|
.texthelper.offset.tent insert 0 [dict get $textdefaults offset]
|
|
|
|
|
set pval [port last]
|
|
|
|
|
incr pval
|
|
|
|
|
.texthelper.port.tent delete 0 end
|
|
|
|
|
.texthelper.port.tent insert 0 $pval
|
|
|
|
|
.texthelper.buttonbar.apply configure -command magic::make_new_label
|
|
|
|
|
.texthelper.buttonbar.okay configure -command \
|
|
|
|
|
"magic::make_new_label ; wm withdraw .texthelper"
|
|
|
|
|
} else {
|
|
|
|
|
if {[llength $slist] == 1} {
|
|
|
|
|
.texthelper.title.tlab configure -text "Selected label: "
|
|
|
|
|
} else {
|
|
|
|
|
.texthelper.title.tlab configure -text "Selected labels: "
|
|
|
|
|
}
|
|
|
|
|
magic::analyze_labels
|
|
|
|
|
.texthelper.buttonbar.apply configure -command magic::change_label
|
|
|
|
|
.texthelper.buttonbar.okay configure -command \
|
|
|
|
|
"magic::change_label ; wm withdraw .texthelper"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|