From 024eb2930059e11dcb1d1a299c5aa545c4cf9bbe Mon Sep 17 00:00:00 2001 From: "John Ankarstr\\xf6m" Date: Thu, 3 Jun 2021 18:34:32 +0200 Subject: Fix state changing bugs, include screenshot in document --- tray.eps | 811 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ xbattext.c | 89 ++++--- xbattext.ms | 189 ++++++++------ 3 files changed, 981 insertions(+), 108 deletions(-) create mode 100644 tray.eps diff --git a/tray.eps b/tray.eps new file mode 100644 index 0000000..39e2bde --- /dev/null +++ b/tray.eps @@ -0,0 +1,811 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: (ImageMagick) +%%Title: (tray.eps) +%%CreationDate: (2021-06-03T16:14:05+00:00) +%%BoundingBox: -0 -0 187 37 +%%HiResBoundingBox: 0 0 187 37 +%%DocumentData: Clean7Bit +%%LanguageLevel: 1 +%%Pages: 1 +%%EndComments + +%%BeginDefaults +%%EndDefaults + +%%BeginProlog +% +% Display a color image. The image is displayed in color on +% Postscript viewers or printers that support color, otherwise +% it is displayed as grayscale. +% +/DirectClassPacket +{ + % + % Get a DirectClass packet. + % + % Parameters: + % red. + % green. + % blue. + % length: number of pixels minus one of this color (optional). + % + currentfile color_packet readhexstring pop pop + compression 0 eq + { + /number_pixels 3 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add 3 mul def + } ifelse + 0 3 number_pixels 1 sub + { + pixels exch color_packet putinterval + } for + pixels 0 number_pixels getinterval +} bind def + +/DirectClassImage +{ + % + % Display a DirectClass image. + % + systemdict /colorimage known + { + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { DirectClassPacket } false 3 colorimage + } + { + % + % No colorimage operator; convert to grayscale. + % + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { GrayDirectClassPacket } image + } ifelse +} bind def + +/GrayDirectClassPacket +{ + % + % Get a DirectClass packet; convert to grayscale. + % + % Parameters: + % red + % green + % blue + % length: number of pixels minus one of this color (optional). + % + currentfile color_packet readhexstring pop pop + color_packet 0 get 0.299 mul + color_packet 1 get 0.587 mul add + color_packet 2 get 0.114 mul add + cvi + /gray_packet exch def + compression 0 eq + { + /number_pixels 1 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add def + } ifelse + 0 1 number_pixels 1 sub + { + pixels exch gray_packet put + } for + pixels 0 number_pixels getinterval +} bind def + +/GrayPseudoClassPacket +{ + % + % Get a PseudoClass packet; convert to grayscale. + % + % Parameters: + % index: index into the colormap. + % length: number of pixels minus one of this color (optional). + % + currentfile byte readhexstring pop 0 get + /offset exch 3 mul def + /color_packet colormap offset 3 getinterval def + color_packet 0 get 0.299 mul + color_packet 1 get 0.587 mul add + color_packet 2 get 0.114 mul add + cvi + /gray_packet exch def + compression 0 eq + { + /number_pixels 1 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add def + } ifelse + 0 1 number_pixels 1 sub + { + pixels exch gray_packet put + } for + pixels 0 number_pixels getinterval +} bind def + +/PseudoClassPacket +{ + % + % Get a PseudoClass packet. + % + % Parameters: + % index: index into the colormap. + % length: number of pixels minus one of this color (optional). + % + currentfile byte readhexstring pop 0 get + /offset exch 3 mul def + /color_packet colormap offset 3 getinterval def + compression 0 eq + { + /number_pixels 3 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add 3 mul def + } ifelse + 0 3 number_pixels 1 sub + { + pixels exch color_packet putinterval + } for + pixels 0 number_pixels getinterval +} bind def + +/PseudoClassImage +{ + % + % Display a PseudoClass image. + % + % Parameters: + % class: 0-PseudoClass or 1-Grayscale. + % + currentfile buffer readline pop + token pop /class exch def pop + class 0 gt + { + currentfile buffer readline pop + token pop /depth exch def pop + /grays columns 8 add depth sub depth mul 8 idiv string def + columns rows depth + [ + columns 0 0 + rows neg 0 rows + ] + { currentfile grays readhexstring pop } image + } + { + % + % Parameters: + % colors: number of colors in the colormap. + % colormap: red, green, blue color packets. + % + currentfile buffer readline pop + token pop /colors exch def pop + /colors colors 3 mul def + /colormap colors string def + currentfile colormap readhexstring pop pop + systemdict /colorimage known + { + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { PseudoClassPacket } false 3 colorimage + } + { + % + % No colorimage operator; convert to grayscale. + % + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { GrayPseudoClassPacket } image + } ifelse + } ifelse +} bind def + +/DisplayImage +{ + % + % Display a DirectClass or PseudoClass image. + % + % Parameters: + % x & y translation. + % x & y scale. + % label pointsize. + % image label. + % image columns & rows. + % class: 0-DirectClass or 1-PseudoClass. + % compression: 0-none or 1-RunlengthEncoded. + % hex color packets. + % + gsave + /buffer 512 string def + /byte 1 string def + /color_packet 3 string def + /pixels 768 string def + + currentfile buffer readline pop + token pop /x exch def + token pop /y exch def pop + x y translate + currentfile buffer readline pop + token pop /x exch def + token pop /y exch def pop + currentfile buffer readline pop + token pop /pointsize exch def pop + x y scale + currentfile buffer readline pop + token pop /columns exch def + token pop /rows exch def pop + currentfile buffer readline pop + token pop /class exch def pop + currentfile buffer readline pop + token pop /compression exch def pop + class 0 gt { PseudoClassImage } { DirectClassImage } ifelse + grestore +} bind def +%%EndProlog +%%Page: 1 1 +%%PageBoundingBox: 0 0 187 37 +userdict begin +DisplayImage +0 0 +187 37 +12 +187 37 +0 +0 +4A0810211008000000000000000000081010000000000000000000000000081000182118182118 +082108082118081000182118082108182108082118182108082118182108183118183118182118 +183118182118183118183118082118182118182118101818081000081010081010181000100808 +000000080818000000000000081010183118182118183118182118183118082118182108182118 +182108082118181000000000100808081000000000391808210000210000100808100808101818 +000000080818081000081010000000000000081010081000000000081000081000081000101818 +183118182118182118082118181000082118182118081010081010081000081010081000081000 +081010182118081000182118081010081010000000000000081000000000081000081010000000 +081000000000181000000000081000000000000000081000312110631810841810843929943129 +8C29187B21105229184A10082110080000000000000000000000000810002110084A0810211008 +000000000000000000081010000000000000000000000000081000182118182118082108082118 +081000182118082108182108082118182108082118182108183118183118182118183118182118 +183118183118082118182118182118101818081000081010081010181000100808000000080818 +000000000000081010183118182118183118182118183118082118182108182118182108082118 +181000000000100808081000000000521008521810210000000000000000000000000000000000 +000000101818182118082108182118081000081010182118081000082118081000182118082118 +182108082118183118183118182118082108182118082118182118183118182108082118213110 +182118081000000000081010000000000000000000000000081010182121182118183118183118 +183118182118182118182118082108182118081000000000000000081000080818081000000000 +000000081000000000081000000000081000000000081000000000081000000000000000080818 +000000081000080818081000182118182118082118081000081000082118182118082108081000 +081000000000000000081010081000082118000000000000000000000000000000000000000000 +000000081000080818081000000000000000081010000000000000000000000000081010101818 +7B21107B21105208086B18086B18086318106318108418107B2110631810521810211008100808 +000000100808420800521008521810210000000000000000000000000000000000000000101818 +182118082108182118081000081010182118081000082118081000182118082118182108082118 +183118183118182118082108182118082118182118183118182108082118213110182118081000 +000000081010000000000000000000000000081010182121182118183118183118183118182118 +1821181821180821081821180810000000000000000810000808180810004208006B0808631810 +211008000000081000000000000000182108182118082108101818082108101818082108081000 +082118081000082118081000182108082118182108182118183118182108182118183118183118 +183118183118213921213110182118101818000000081010000000081000000000000000081000 +101818183118183118182118183118182118182118182118082108182118081010000000080818 +181000000000081000000000000000081010000000000000000000101818000000000000080818 +081000000000000000081000000000081000000000081000081000182108082118182108081000 +182118081000182108082108081010000000080818081000081000081010081000081010000000 +000000000000000000000000000000080818000000081000080818081000081000000000000000 +0000000808180810000000003121107B21106318105208084208005208085208085208086B1808 +7B18187B21107B21106318104A10081008082100005218104208006B0808631810211008000000 +081000000000000000182108182118082108101818082108101818082108081000082118081000 +082118081000182108082118182108182118183118182108182118183118183118183118183118 +213921213110182118101818000000081010000000081000000000000000081000101818183118 +183118182118183118182118182118182118082108182118081010000000080818181000000000 +0810000000005208085210088C2918631810100808000000000000101818081000182108081000 +081000182118081000081000081010181000082118081000182118081000081000082118183118 +183118183118213110183121213921213921314231213921081010000000000000000000000000 +101818000000000000182118182118182118082118182118182118082108182118082108182108 +082118081000081000000000000000081000081010000000081000000000000000000000081000 +080818000000081000000000000000000000081000080818000000000000000000081010000000 +081010182118081000081000081010081000082118081010182118081000081000000000000000 +081010081000182118000000000000000000000000000000000000000000000000181000081010 +0810000808180000001810000000000810000000000810001821183918087B2110521810520808 +5208085208086B18086B08087B18188C29187B18185210085210084A1008100808210000521810 +5208085210088C2918631810100808000000000000101818081000182108081000081000182118 +081000081000081010181000082118081000182118081000081000082118183118183118183118 +213110183121213921213921314231213921081010000000000000000000000000101818000000 +000000182118182118182118082118182118182118082108182118082108182108082118081000 +0810000000000000000810000810100000000810005208085208086318108421214A1008081000 +182118081000082118081000081010082118081000081010081010081000081010081000081010 +081000081000182118101818213110314229425231314231314229315242314231182121000000 +000000000000000000081000000000000000081000081000182108182118082118182108182118 +082108182118082108082118182118081000100808000000100810081000000000000000181000 +181000000000000000081010081000000000081000000000081000000000181000000000000000 +0000001810000000000000000810001821182110084A31184A21103121104A21102110084A2110 +521008312110181000000000081000081000081000081010081000000000000000000000000000 +000000000000000000080818081000080818081000081000000000081010000000000000080818 +2929184218107B18185208085208087310087B18186B18088C29187310088C29187B18186B1808 +6B08085218104208005218104208005208085208086318108421214A1008081000182118081000 +082118081000081010082118081000081010081010081000081010081000081010081000081000 +182118101818213110314229425231314231314229315242314231182121000000000000000000 +000000081000000000000000081000081000182108182118082118182108182118082108182118 +0821080821181821180810001008080000001008100810000000000000001810001810004A0810 +5208086B18086B1808390808081010081000081010081000081010081000081000081010081000 +000000081000081000081010081000081010182118181000213110313129425231294229294231 +4A6342213921100808000000000000000000000000000000080818000000081000080818081010 +182118183118182108082118182118182108082118182108082108081010000000000000100808 +0000000000000810100810001008107B2110000000000000000000101818000000000000000000 +0000001018180000000000001810000808180000000000000810001018182921086B21107B2110 +6318106B18085218106318107B21105218108418107B2110421810100810081000081010082108 +081010000000000000000000000000000000000000000000000000000000081000081010081010 +0000000000001810000000000810001008085210086B18085208088C29187310086B18086B1808 +6318106B18087B18187310086B18085208084208005218105208084208004A08105208086B1808 +6B1808390808081010081000081010081000081010081000081000081010081000000000081000 +0810000810100810000810101821181810002131103131294252312942292942314A6342213921 +100808000000000000000000000000000000080818000000081000080818081010182118183118 +182108082118182118182108082118182108082108081010000000000000100808000000000000 +0810100810001008107B2110420800520808520808521810211008081000081000081000081010 +0810000810000810100810000000000810000000000808180810000000003121107B3118844229 +7B31216331214A4229313129315239213921100808000000000000000000000000000000000000 +000000081000000000000000082118182118182108082118182118082108082118182108081000 +101818100808000000101818000000000000081000000000000000312110631810000000000000 +000000000000000000081000000000100808000000000000081010000000000000000000081000 +0000001810004221087B18185208085218106B08085208088418106318106B1808943129842121 +731008391808101818081010181000101818000000000000000000000000000000000000000000 +0000000808180810000810100000000810101810000000000000000000001008086B1808631810 +6B18088C29187B21106B18087308083908085210088C29187B2110631810631810420800420800 +5208084A0810420800520808520808521810211008081000081000081000081010081000081000 +0810100810000000000810000000000808180810000000003121107B31188442297B3121633121 +4A4229313129315239213921100808000000000000000000000000000000000000000000081000 +000000000000082118182118182108082118182118082108082118182108081000101818100808 +0000001018180000000000000810000000000000003121106318104A08105210088C2918631810 +100808081000081010081000081010081000000000080818000000081000080818081000000000 +0810002110087329219431298439297310086B1808521008633121523921100808000000000000 +000000000000000000000000000000000000000000081010081000182118183118082118182108 +082118182108082118081000182118081000000000181000000000081000080818000000181000 +081010390808521810081000081000000000081000080818000000000000000000000000000000 +0000000000000810000000000808180000002929188C29187B21105208086B08084208007B1818 +6B18086B08086318109429108C29187B21107B1818521008292108081010181000081000000000 +000000100808000000000000000000000000000000081000081010081000000000080818000000 +0810000000003918086318107B18186B08089431297B21105208085210081008086B1808731008 +7B18186B08085208084A08103908086B08084208004A08105210088C2918631810100808081000 +081010081000081010081000000000080818000000081000080818081000000000081000211008 +7329219431298439297310086B1808521008633121523921100808000000000000000000000000 +000000000000000000000000000000081010081000182118183118082118182108082118182108 +082118081000182118081000000000181000000000081000080818000000181000081010390808 +5218104208007B18188C2918521008210000080818081000081010000000080818081000000000 +0810100000000810000000000810001008084218107B21107310086B0808521008521008520808 +6B18084A1008000000000000000000100808000000000000100810081000000000000000081010 +181000082118182118182118082118181000082108182118181000082118000000081000000000 +101818081000000000000000081000101818211008391808081000081010081000080818000000 +0000000000000810000000000000001810000000000808180000000000000810003918087B2110 +7B21105208085208085208086B08087B18185208085208088C29188C29188C29186B18087B2110 +842121312108101818000000000000000000000000080818181000000000000000000000000000 +0000000810100810000000000810000810102110085218106318106B18087310088C2918631810 +6B08085208082100006B18087B18186B18086B18086B0808520808390808521810420800420800 +7B18188C2918521008210000080818081000081010000000080818081000000000081010000000 +0810000000000810001008084218107B21107310086B08085210085210085208086B18084A1008 +000000000000000000100808000000000000100810081000000000000000081010181000082118 +182118182118082118181000082108182118181000082118000000081000000000101818081000 +000000000000081000101818211008391808FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E57E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7EE5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E57E7E7EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E7E7E7E7E7EE5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E57E7E7E +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E57E7E7E7E7E7E +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E57E7E7EE5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E57E7E7E7E7E7EE5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E57E7E7EE5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E57E7E7E7E7E7EE5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E57E7E7EE5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +7E7E7E7E7E7EE5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E57E7E7EE5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E57E7E7E7E7E7EE5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E57E7E7EE5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E57E7E7E7E7E7EE5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E57E7E7EE5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E57E7E7E7E7E7EE5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E57E7E7EE5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E57E7E7E7E7E7EE5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E500CD0000CD0000CD00E5E5E5E5E5E5E5E5E5E5E5E5E5E5E500CD00E5E5E5E5E5E5 +00CD0000CD00E5E5E5E5E5E500CD00E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5000000E5E5E5E5E5E5E5E5E5E5E5E5000000000000000000E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5000000000000E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5000000E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +7E7E7EE5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E57E7E7E +7E7E7EE5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E500CD00E5E5E5E5E5E5E5E5E500CD00E5E5E5E5E5E5 +E5E5E500CD0000CD00E5E5E5E5E5E500CD0000CD00E5E5E5E5E5E500CD00E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5000000000000E5E5E5E5E5E5E5E5E5 +000000E5E5E5E5E5E5E5E5E5000000E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +000000E5E5E5E5E5E5000000E5E5E5E5E5E5E5E5E5000000000000E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E57E7E7EE5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E57E7E7E7E7E7EE5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E500CD00E5E5E5 +E5E5E5E5E5E500CD00E5E5E5E5E5E500CD00E5E5E500CD00E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +00CD00E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5000000E5E5E5E5E5E5E5E5E5000000E5E5E5E5E5E5E5E5E5000000E5E5E5E5E5E5000000 +000000E5E5E5E5E5E5E5E5E5E5E5E5000000E5E5E5E5E5E5000000E5E5E5E5E5E5000000E5E5E5 +000000E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E57E7E7EE5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E57E7E7E7E7E7EE5E5E5E5E5E5 +E5E5E5E5E5E5FF0000E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E500CD0000CD0000CD0000CD00E5E5E500CD00E5E5E5E5E5E500CD00 +E5E5E5E5E5E5E5E5E5E5E5E500CD00E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5000000E5E5E5E5E5E5E5E5E5E5E5E5000000000000 +000000E5E5E5E5E5E5E5E5E5000000000000E5E5E5E5E5E5E5E5E5E5E5E5000000E5E5E5E5E5E5 +000000E5E5E5000000E5E5E5E5E5E5000000E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E57E7E7EE5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E57E7E7E7E7E7EE5E5E5E5E5E5E5E5E5E5E5E5FF0000E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E500CD00 +E5E5E500CD0000CD0000CD0000CD0000CD00E5E5E5E5E5E500CD00E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5000000E5E5E5 +E5E5E5E5E5E5000000E5E5E5E5E5E5E5E5E5000000E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5000000E5E5E5E5E5E5000000E5E5E5000000000000000000000000000000E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E57E7E7EE5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E57E7E7E7E7E7EE5E5E5E5E5E5E5E5E5E5E5E5FF0000 +FF0000E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E500CD00E5E5E5E5E5E5E5E5E5E5E5E5E5E5E500CD00E5E5E5E5E5E500CD00 +E5E5E5E5E5E500CD0000CD00E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5000000E5E5E5E5E5E5E5E5E5000000E5E5E5E5E5E5E5E5E5000000E5E5E5 +E5E5E5000000000000E5E5E5E5E5E5E5E5E5E5E5E5000000E5E5E5E5E5E5000000E5E5E5E5E5E5 +E5E5E5E5E5E5000000E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E57E7E7E +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E57E7E7E7E7E7E +E5E5E5E5E5E5E5E5E5E5E5E5FF0000FF0000FF0000FF0000E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E500CD0000CD00E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E500CD00E5E5E5E5E5E500CD00E5E5E5E5E5E500CD0000CD00E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5000000000000000000E5E5E5E5E5E5E5E5E5 +000000000000000000E5E5E5E5E5E5E5E5E5000000000000E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +000000000000E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5000000E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E57E7E7EE5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E57E7E7E7E7E7EE5E5E5E5E5E5E5E5E5E5E5E5FF0000FF0000FF0000FF0000 +FF0000E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E57E7E7EE5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E57E7E7E7E7E7EE5E5E5E5E5E5E5E5E5 +E5E5E5FF0000FF0000FF0000FF0000FF0000FF0000E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E57E7E7EE5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +7E7E7E7E7E7EE5E5E5E5E5E5E5E5E5E5E5E5FF0000FF0000FF0000FF0000FF0000FF0000FF0000 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5FF0000FF0000E5E5E5FF0000E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E57E7E7EE5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E57E7E7E7E7E7EE5E5E5E5E5E5E5E5E5E5E5E5FF0000FF0000 +FF0000FF0000FF0000FF0000FF0000FF0000E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +FF0000E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5FF0000E5E5E5FF0000FF0000E5E5E5E5E5E5FF0000FF0000 +FF0000FF0000FF0000E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E57E7E7EE5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E57E7E7E7E7E7EE5E5E5 +E5E5E5E5E5E5FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 +E5E5E5E5E5E5E5E5E5FF0000E5E5E5FF0000FF0000FF0000E5E5E5E5E5E5FF0000FF0000E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5FF0000FF0000 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5FF0000FF0000E5E5E5FF0000FF0000FF0000 +FF0000FF0000E5E5E5FF0000FF0000FF0000FF0000FF0000FF0000FF0000E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E57E7E7EE5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E57E7E7E7E7E7EE5E5E5E5E5E5E5E5E5FF0000FF0000FF0000FF0000FF0000FF0000 +FF0000FF0000FF0000FF0000FF0000FF0000FF0000E5E5E5FF0000FF0000FF0000FF0000FF0000 +FF0000FF0000FF0000FF0000FF0000FF0000E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5FF0000FF0000FF0000FF0000E5E5E5E5E5E5E5E5E5FF0000FF0000FF0000 +FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 +FF0000FF0000FF0000FF0000E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E57E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7EE5E5E5E5E5E5E5E5E5FF0000 +FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 +FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 +FF0000FF0000E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5FF0000FF0000FF0000FF0000FF0000 +FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 +FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +E5E5E5E5E5E5E5E5E5E5E5E5FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 +FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 +FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 +FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 +FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000FF0000 +FF0000E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E57E7E7EE5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5 +E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E5E57E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E +7E7E7E7E7E7E7E7E7E + +end +%%PageTrailer +%%Trailer +%%EOF diff --git a/xbattext.c b/xbattext.c index 4f56225..36c093e 100644 --- a/xbattext.c +++ b/xbattext.c @@ -34,7 +34,7 @@ #include /* interval in seconds */ -#define INTERVAL 10 +#define INTERVAL 5 /* low battery level */ #define ALERT 30 @@ -65,10 +65,19 @@ static XtResource res_opts[] = { XtOffset(struct res*, charge_foreground), XtRImmediate, (caddr_t)NULL}, }; +/* state changes */ +enum { + SET_NONE = 0, + SET_NOALERT = 1 << 0, + SET_NOCHARGE = 1 << 1, + SET_ALERT = 1 << 2, + SET_CHARGE = 1 << 3 +} change; + /* application state */ Arg wargs[10]; char *s; -int apmfd, alert, charge; +int apmfd, alerting, charging; struct apm_power_info info; Widget toplevel, label; XmString xms; @@ -100,8 +109,8 @@ main(int argc, char* argv[]) xmLabelWidgetClass, toplevel, XmNlabel, "", NULL); - alert = 0; - charge = 0; + alerting = 0; + charging = 0; update(NULL, NULL); XtRealizeWidget(toplevel); @@ -114,6 +123,10 @@ update(XtPointer client_data, XtIntervalId *t) { int i; + /* reset temporary variables */ + i = 0; + change = SET_NONE; + /* get battery info */ memset(&info, 0, sizeof(info)); if (ioctl(apmfd, APM_IOC_GETPOWER, &info) == -1) { @@ -125,57 +138,57 @@ update(XtPointer client_data, XtIntervalId *t) /* put battery status into label */ sprintf(s, "%d%%", info.battery_life); xms = XmStringCreate(s, XmFONTLIST_DEFAULT_TAG); - - /* set color and font depending on battery status */ - i = 0; XtSetArg(wargs[i], XmNlabelString, xms); i++; - /* check if the ac adapter has been plugged in */ - if (!charge && info.ac_state == APM_AC_ON) { - charge = 1; - XtSetArg(wargs[i], XtNforeground, res.charge_foreground); + /* check charging status */ + if (!charging && info.ac_state == APM_AC_ON) + change |= SET_CHARGE; + else if (charging && info.ac_state != APM_AC_ON) + change |= SET_NOCHARGE; + charging = info.ac_state == APM_AC_ON; + + /* check low battery */ + if (!alerting && info.battery_life < ALERT) + change |= SET_ALERT; + else if (alerting && info.battery_life >= ALERT) + change |= SET_NOALERT; + alerting = info.battery_life < ALERT; + + /* prioritize charging and low battery indications */ + if (change & SET_CHARGE) change = SET_CHARGE; + if (change & SET_NOCHARGE && alerting) change = SET_ALERT; + if (change & SET_NOALERT && charging) change = SET_CHARGE; + + /* act on state changes */ + switch(change & 0xf) { + case SET_NOCHARGE: + case SET_NOALERT: + XtSetArg(wargs[i], XtNforeground, res.foreground); i++; - if (res.charge_font_list != NULL) { - XtSetArg(wargs[i], XmNfontList, res.charge_font_list); - i++; - } else if (res.font_list != NULL) { + if (res.font_list != NULL) { XtSetArg(wargs[i], XmNfontList, res.font_list); i++; } - goto set; /* skip further checks */ - } - - /* check low battery */ -#ifdef ALERT - if (!alert && info.battery_life < ALERT) { - alert = 1; + break; + case SET_ALERT: XtSetArg(wargs[i], XtNforeground, res.alert_foreground); i++; if (res.alert_font_list != NULL) { XtSetArg(wargs[i], XmNfontList, res.alert_font_list); i++; } - } else if (alert && info.battery_life >= ALERT) { - alert = 0; - XtSetArg(wargs[i], XtNforeground, res.foreground); + break; + case SET_CHARGE: + XtSetArg(wargs[i], XtNforeground, res.charge_foreground); i++; - if (res.font_list != NULL) { - XtSetArg(wargs[i], XmNfontList, res.font_list); + if (res.charge_font_list != NULL) { + XtSetArg(wargs[i], XmNfontList, res.charge_font_list); i++; - } - } -#endif - - /* check if the ac adapter has been plugged out */ - if (charge && info.ac_state != APM_AC_ON) { - charge = 0; - if (i > 1) goto set; /* don't overwrite alert */ - XtSetArg(wargs[i], XtNforeground, res.foreground); - i++; - if (res.font_list != NULL) { + } else if (res.font_list != NULL) { XtSetArg(wargs[i], XmNfontList, res.font_list); i++; } + break; } set: XtSetValues(label, wargs, i); diff --git a/xbattext.ms b/xbattext.ms index e000dd3..44cdde8 100644 --- a/xbattext.ms +++ b/xbattext.ms @@ -31,6 +31,10 @@ It is generated with .I re , a reference-based literate programming system available at the WWW address http://git.\:ankarstrom.se/re/. +.PP +If you want to see a screenshot of +.I xbattext , +skip ahead to the last page. .AE .Re xbattext.c:/^#include/ .LP @@ -42,10 +46,10 @@ That file, in turn, includes for us. .PP .I machine/apmvar.h -is needed in order to inspect the battery status on NetBSD. +has definitions needed in order to inspect the battery status on NetBSD. .Re xbattext.c:/^\/\* interval in seconds/ .LP -By default, the battery status is checked every ten seconds. +By default, the battery status is checked every five seconds. .Re xbattext.c:/^\/\* low battery level/ .LP By default, the battery level is considered to be low @@ -74,6 +78,14 @@ http://lesstif.\:sourceforge.net/doc/super-ux/g1ae03e/part1/chap9.html. .FE .Re xbattext.c:/"alertFontList"/ \& +.Re xbattext.c:/^\/\* state changes/ +.LP +The +.I change +variable represents the possible changes in battery state. +.I xbattext +updates the font and color of the battery display +whenever one of these state changes occur. .Re xbattext.c:/^\/\* application state/ .LP There is not space to explain the function of all variables @@ -83,19 +95,20 @@ but some of them deserve a special mention: .ps -1p .vs -1p .I wargs -is used by -.I XtSetArg , +is an array used by +.I XtSet\%Arg , which stores arguments in it, and .I XtSetValues , -which sets new values for a widget +which applies new settings to a given widget according to the arguments stored in it. .PP .ps -1p .vs -1p -.I alert +The boolean values +.I alerting and -.I charge -are boolean variables that are set to true +.I charging +that are set to true whenever .I xbattext detects that the battery is low or @@ -111,7 +124,7 @@ and a variadic variant, marked by the component of its name. .PP .I toplevel -contains the +is the .Q main widget that contains all actual widgets. .Re xbattext.c:/open("\/dev\/apm"/ @@ -121,16 +134,16 @@ The battery level is queried through requests to .I /dev/apm . The file descriptor is closed by the kernel when the program exits. +.bp .Re xbattext.c:/^ \/\* load application resources/ .LP -As mentioned earlier, +As mentioned above, .I XtGetApplicationResources uses the .I XtResour\%ce -list defined above to fill the +list defined earlier to fill the .I res structure with the corresponding resources. -.bp .Re xbattext.c:/^ \/\* create motif label/ .LP The battery level is displayed in a Motif label widget. @@ -139,7 +152,7 @@ It starts out containing an empty string. .LP Before starting the main event loop, the .I update -function is called, which registers a timeout that will run +function is called, which creates a timer that will run independently of the event loop.\** .FS For more information about timeouts, see @@ -149,7 +162,7 @@ http://motifdeveloper.com/tips/tip16.html. .LP The .I update -function, which is called at the end of each timeout, +function, which is also called at the end of each timeout, is responsible for checking the battery status and updating the label. .PP @@ -159,7 +172,7 @@ The second argument contains a pointer to the timeout ID. Neither argument is used in this program. .Re xbattext.c:/^ \/\* get battery info/ .LP -As mentioned earlier, +As mentioned above, the battery status is retrieved through an .I ioctl request, @@ -173,79 +186,80 @@ The battery percentage, contained in .I info.battery_life , is written to an .I XmString , -which is a special type of string used by Motif. +a special type of string used by Motif. It is associated with a .Q "font list element tag" , -which contains information about the visual characteristics of the text. +containing information about the visual characteristics of the text. We just use the default. -.Re xbattext.c:/^ \/\* set color and font/ +.Re xbattext.c:/^ XtSetArg(/ .LP -In the following section, the +The .I wargs -array mentioned earlier is filled with a number of arguments -that determine the visual appearance of the label widget. +array mentioned above starts to be filled with arguments +that determine the state of the label widget. The number of arguments set is kept track of in the .I i variable. -To begin with, the widget's label string is set to the previously defined +To begin with, the widget's label string is set to the .I XmString -value. -.bp -.Re xbattext.c:/^ \/\* check .* ac adapter .* plugged in/ +value defined earlier. +.Re xbattext.c:/^ \/\* check charging status/ .LP -Whenever the value of +The bits +.CW SET_CHARGE +and +.CW SET_\:NOCHARGE +are added to the +.I charge +bitmap when a change in .I info.ac_\:state -is changed to -.CW APM_AC_ON , -signifying that the AC adapter is plugged in, -the label widget's foreground color and font is set -according to the application resources. -If no -.I chargeForeground -resource is defined, the -.I XtGetApplicationResources -function sets the color to the integer value zero, -which is the color black -(thus, the program cannot differentiate -between a missing value and a value of -.I black ). -The font list, however, is set to null if undefined. -If it is undefined, the main font list is used. +is detected. .PP -Note that the -.I charge -variable is set in order to prevent these font and color changes +Note that the value of +.I charging +is used in order to prevent these font and color changes from unnecessarily being applied every timeout regardless of whether the charging status has changed. -Note also that any further checks are skipped via a -.I goto -statement, -as the charging indication should override the low battery indication. .Re xbattext.c:/^ \/\* check low battery/ .LP The same applies when the program checks whether the battery level is below .CW ALERT , which is set to 30 by default. -.PP -If, after being below the threshold, the battery level rises above it, -the color and font are reset to their default values. -.bp -.Re xbattext.c:/^ \/\* check .* ac adapter .* plugged out/ +.Re xbattext.c:/^ \/\* prioritize/ .LP -After the low battery checks, -the program checks whether the AC adapter has been plugged out. -While the low battery indication should not be overriden -by a return to a normal, non-charging state, -it is important that the -.I charge -variable is updated to reflect the state. +Before the bits in +.I change +are acted upon, +some prioritization is necessary. +The charging indication overrides any other indication. +The low battery indication is activated +if the AC adapter is plugged out, +but the battery is still low. +Likewise, the charging indication is activated +if the battery rises above the +.CW ALERT +threshold, +but the AC adapter is still plugged in. +.Re xbattext.c:/^ \/\* act on state changes/ +.LP +After collecting and prioritizing the state changes, +the foreground color and font of the label widget is set accordingly. .PP -The value of the -.I i -counter is inspected to see whether the low battery checks above -have triggered any color or font changes. -If they haven't, the color and font are reset to their default values, -signifying a neither charging nor low battery. +Note that if a +.I Pixel +(color) resource is not defined, +.I XtGetApplicationResources +gives it the integer value zero, +which also signifies the color black +(thus, the program cannot differentiate +between a missing value and a value of +.I black ). +Font lists, however, are set to null if undefined. +If a font list resource is undefined, +.I xbattext +uses the default font list instead. +.Re xbattext.c:/^ case SET_CHARGE:/ +\& .Re xbattext.c:/^set:/ .LP Finally, the values collected in @@ -273,12 +287,47 @@ source what the program does and how it should be compiled, was excluded). Hopefully, it shows that graphical UNIX programming is nothing to be scared of. While Xlib, Xt and Xm tend nowadays not to be considered -.Q "best practice" -(whatever that means), +.Q "best practice" , they have a low barrier to entry, require little resources from the computer and are often installed by default on UNIX systems. -It is better to use worse practices to create something +It is better to use worse practices to create +.I something than to use best practices and create nothing at all; if those are the alternatives, then perhaps best practices aren't. +.PP +If, after reading the source code, you are still wondering +why anyone would want a small window displaying the current battery level, +then you should get acquainted with the X11 window manager +.I jwm \\* +.FS +.I jwm +is available at https://joewing.net/projects/jwm/. +My personal fork of +.I jwm +1.8, +which has a more traditional visual appearance, +is available at http://git.ankarstrom.se/jwm/. +.FE +and its +.Q swallowing +feature, +which removes the border from a given X11 program and displays it in the tray. +You can look at it as tray icons according to the UNIX philosophy. +In my tray, +.I xbattext +sits right beside +.I xclock +and +.I xload . +.sp 0.6v +.PSPIC tray.eps +.sp 0.2v +.ad c +.ps -1p +.B "Figure 1." +.I xload , +.I xbattext +and +.I xclock . -- cgit v1.2.3