From 5a184b0433ba31f9d9dca576ddcfb01eff910196 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Mon, 9 Oct 2017 23:35:42 +0300 Subject: [PATCH] Don't include CSS, javascript and image data directly in the code --- Makefile.in | 14 +- priv/css/admin.css | 279 +++++++++++++++++++++++++++ priv/css/bosh.css | 51 +++++ priv/css/muc.css | 27 +++ priv/css/oauth.css | 103 ++++++++++ priv/img/admin-logo-fill.png | Bin 0 -> 177 bytes priv/img/admin-logo.png | Bin 0 -> 26648 bytes priv/img/bosh-logo.png | Bin 0 -> 5615 bytes priv/img/favicon.png | Bin 0 -> 1342 bytes priv/img/oauth-logo.png | Bin 0 -> 5615 bytes priv/img/powered-by-ejabberd.png | Bin 0 -> 954 bytes priv/img/powered-by-erlang.png | Bin 0 -> 880 bytes priv/img/valid-xhtml10.png | Bin 0 -> 2414 bytes priv/img/vcss.png | Bin 0 -> 1134 bytes priv/js/admin.js | 15 ++ priv/js/muc.js | 8 + src/ejabberd_oauth.erl | 123 ++---------- src/ejabberd_web_admin.erl | 320 +++---------------------------- src/misc.erl | 47 ++++- src/mod_bosh.erl | 64 ++----- src/mod_muc_log.erl | 277 ++------------------------ 21 files changed, 606 insertions(+), 722 deletions(-) create mode 100644 priv/css/admin.css create mode 100644 priv/css/bosh.css create mode 100644 priv/css/muc.css create mode 100644 priv/css/oauth.css create mode 100644 priv/img/admin-logo-fill.png create mode 100644 priv/img/admin-logo.png create mode 100644 priv/img/bosh-logo.png create mode 100644 priv/img/favicon.png create mode 100644 priv/img/oauth-logo.png create mode 100644 priv/img/powered-by-ejabberd.png create mode 100644 priv/img/powered-by-erlang.png create mode 100644 priv/img/valid-xhtml10.png create mode 100644 priv/img/vcss.png create mode 100644 priv/js/admin.js create mode 100644 priv/js/muc.js diff --git a/Makefile.in b/Makefile.in index 5d184a431..0edd8c844 100644 --- a/Makefile.in +++ b/Makefile.in @@ -49,6 +49,12 @@ MSGSDIR = $(PRIVDIR)/msgs # /usr/lib/ejabberd/priv/css CSSDIR = $(PRIVDIR)/css +# /usr/lib/ejabberd/priv/img +IMGDIR = $(PRIVDIR)/img + +# /usr/lib/ejabberd/priv/js +JSDIR = $(PRIVDIR)/js + # /usr/lib/ejabberd/priv/sql SQLDIR = $(PRIVDIR)/sql @@ -132,7 +138,7 @@ DEPS_FILES=$(call FILES_WILDCARD,$(foreach DEP,$(DEPS),deps/$(DEP)/ebin/*.beam d DEPS_FILES_FILTERED=$(filter-out %/epam %/eimp deps/elixir/ebin/elixir.app,$(DEPS_FILES)) DEPS_DIRS=$(sort deps/ $(foreach DEP,$(DEPS),deps/$(DEP)/) $(dir $(DEPS_FILES))) -MAIN_FILES=$(filter-out %/configure.beam,$(call FILES_WILDCARD,ebin/*.beam ebin/*.app priv/msgs/*.msg priv/css/*.css priv/lib/* include/*.hrl COPYING)) +MAIN_FILES=$(filter-out %/configure.beam,$(call FILES_WILDCARD,ebin/*.beam ebin/*.app priv/msgs/*.msg priv/css/*.css priv/img/*.png priv/js/*.js priv/lib/* include/*.hrl COPYING)) MAIN_DIRS=$(sort $(dir $(MAIN_FILES)) priv/bin priv/sql) define DEP_VERSION_template @@ -253,10 +259,14 @@ uninstall-binary: rm -fr $(PBINDIR) rm -f $(SODIR)/*.so rm -fr $(SODIR) - rm -f $(MSGSDIR)/*.msgs + rm -f $(MSGSDIR)/*.msg rm -fr $(MSGSDIR) rm -f $(CSSDIR)/*.css rm -fr $(CSSDIR) + rm -f $(IMGDIR)/*.png + rm -fr $(IMGDIR) + rm -f $(JSDIR)/*.js + rm -fr $(JSDIR) rm -f $(SQLDIR)/*.sql rm -fr $(SQLDIR) rm -fr $(PRIVDIR) diff --git a/priv/css/admin.css b/priv/css/admin.css new file mode 100644 index 000000000..e07678391 --- /dev/null +++ b/priv/css/admin.css @@ -0,0 +1,279 @@ +html,body { + margin: 0; + padding: 0; + height: 100%; + background: #f9f9f9; + font-family: sans-serif; +} +body { + min-width: 990px; +} +a { + text-decoration: none; + color: #3eaffa; +} +a:hover, +a:active { + text-decoration: underline; +} +#container { + position: relative; + padding: 0; + margin: 0 auto; + max-width: 1280px; + min-height: 100%; + height: 100%; + margin-bottom: -30px; + z-index: 1; +} +html>body #container { + height: auto; +} +#header h1 { + width: 100%; + height: 50px; + padding: 0; + margin: 0; + background-color: #49cbc1; +} +#header h1 a { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 50px; + padding: 0; + margin: 0; + background: url('@BASE@logo.png') 10px center no-repeat transparent; + background-size: auto 25px; + display: block; + text-indent: -9999px; +} +#clearcopyright { + display: block; + width: 100%; + height: 30px; +} +#copyrightouter { + position: relative; + display: table; + width: 100%; + height: 30px; + z-index: 2; +} +#copyright { + display: table-cell; + vertical-align: bottom; + width: 100%; + height: 30px; +} +#copyright a { + font-weight: bold; + color: #fff; +} +#copyright p { + margin-left: 0; + margin-right: 0; + margin-top: 5px; + margin-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 5px; + padding-bottom: 5px; + width: 100%; + color: #fff; + background-color: #30353E; + font-size: 0.75em; + text-align: center; +} +#navigation { + display: inline-block; + vertical-align: top; + width: 30%; +} +#navigation ul { + padding: 0; + margin: 0; + width: 90%; + background: #fff; +} +#navigation ul li { + list-style: none; + margin: 0; + + border-bottom: 1px solid #f9f9f9; + text-align: left; +} +#navigation ul li a { + margin: 0; + display: inline-block; + padding: 10px; + color: #333; +} +ul li #navhead a, ul li #navheadsub a, ul li #navheadsubsub a { + font-size: 1.5em; + color: inherit; +} +#navitemsub { + border-left: 0.5em solid #424a55; +} +#navitemsubsub { + border-left: 2em solid #424a55; +} +#navheadsub, +#navheadsubsub { + padding-left: 0.5em; +} +#navhead, +#navheadsub, +#navheadsubsub { + border-top: 3px solid #49cbc1; + background: #424a55; + color: #fff; +} +#lastactivity li { + padding: 2px; + margin-bottom: -1px; +} +thead tr td { + background: #3eaffa; + color: #fff; +} +thead tr td a { + color: #fff; +} +td.copy { + text-align: center; +} +tr.head { + color: #fff; + background-color: #3b547a; + text-align: center; +} +tr.oddraw { + color: #412c75; + background-color: #ccd4df; + text-align: center; +} +tr.evenraw { + color: #412c75; + background-color: #dbe0e8; + text-align: center; +} +td.leftheader { + color: #412c75; + background-color: #ccccc1; + padding-left: 5px; + padding-top: 2px; + padding-bottom: 2px; + margin-top: 0px; + margin-bottom: 0px; +} +td.leftcontent { + color: #000044; + background-color: #e6e6df; + padding-left: 5px; + padding-right: 5px; + padding-top: 2px; + padding-bottom: 2px; + margin-top: 0px; + margin-bottom: 0px; +} +td.rightcontent { + color: #000044; + text-align: justify; + padding-left: 10px; + padding-right: 10px; + padding-bottom: 5px; +} + +h1 { + color: #000044; + padding-top: 2px; + padding-bottom: 2px; + margin-top: 0px; + margin-bottom: 0px; +} +h2 { + color: #000044; + text-align: center; + padding-top: 2px; + padding-bottom: 2px; + margin-top: 0px; + margin-bottom: 0px; +} +h3 { + color: #000044; + text-align: left; + padding-top: 20px; + padding-bottom: 2px; + margin-top: 0px; + margin-bottom: 0px; +} +#content ul { + padding-left: 1.1em; + margin-top: 1em; +} +#content ul li { + list-style-type: disc; + padding: 5px; +} +#content ul.nolistyle>li { + list-style-type: none; +} +#content { + display: inline-block; + vertical-align: top; + padding-top: 25px; + width: 70%; +} +div.guidelink, +p[dir=ltr] { + display: inline-block; + float: right; + + margin: 0; + margin-right: 1em; +} +div.guidelink a, +p[dir=ltr] a { + display: inline-block; + border-radius: 3px; + padding: 3px; + + background: #3eaffa; + + text-transform: uppercase; + font-size: 0.75em; + color: #fff; +} +table { + margin-top: 1em; +} +table tr td { + padding: 0.5em; +} +table tr:nth-child(odd) { + background: #fff; +} +table.withtextareas>tbody>tr>td { + vertical-align: top; +} +textarea { + margin-bottom: 1em; +} +input, +select { + font-size: 1em; +} +p.result { + border: 1px; + border-style: dashed; + border-color: #FE8A02; + padding: 1em; + margin-right: 1em; + background: #FFE3C9; +} +*.alignright { + text-align: right; +} diff --git a/priv/css/bosh.css b/priv/css/bosh.css new file mode 100644 index 000000000..efa6b68b5 --- /dev/null +++ b/priv/css/bosh.css @@ -0,0 +1,51 @@ +body { + margin: 0; + padding: 0; + font-family: sans-serif; + color: #fff; +} +h1 { + font-size: 3em; + color: #444; +} +p { + line-height: 1.5em; + color: #888; +} +a { + color: #fff; +} +a:hover, +a:active { + text-decoration: underline; +} +.container { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: #424A55; + background-image: -webkit-linear-gradient(270deg, rgba(48,52,62,0) 24%, #30353e 100%); + background-image: linear-gradient(-180deg, rgba(48,52,62,0) 24%, #30353e 100%); +} +.section { + padding: 3em; +} +.white.section { + background: #fff; + border-bottom: 4px solid #41AFCA; +} +.white.section a { + text-decoration: none; + color: #41AFCA; +} +.white.section a:hover, +.white.section a:active { + text-decoration: underline; +} +.block { + margin: 0 auto; + max-width: 900px; + width: 100%; +} diff --git a/priv/css/muc.css b/priv/css/muc.css new file mode 100644 index 000000000..48b7a19fa --- /dev/null +++ b/priv/css/muc.css @@ -0,0 +1,27 @@ +.ts {color: #AAAAAA; text-decoration: none;} +.mrcm {color: #009900; font-style: italic; font-weight: bold;} +.msc {color: #009900; font-style: italic; font-weight: bold;} +.msm {color: #000099; font-style: italic; font-weight: bold;} +.mj {color: #009900; font-style: italic;} +.ml {color: #009900; font-style: italic;} +.mk {color: #009900; font-style: italic;} +.mb {color: #009900; font-style: italic;} +.mnc {color: #009900; font-style: italic;} +.mn {color: #0000AA;} +.mne {color: #AA0099;} +a.nav {color: #AAAAAA; font-family: monospace; letter-spacing: 3px; text-decoration: none;} +div.roomtitle {border-bottom: #224466 solid 3pt; margin-left: 20pt;} +div.roomtitle {color: #336699; font-size: 24px; font-weight: bold; font-family: sans-serif; letter-spacing: 3px; text-decoration: none;} +a.roomjid {color: #336699; font-size: 24px; font-weight: bold; font-family: sans-serif; letter-spacing: 3px; margin-left: 20pt; text-decoration: none;} +div.logdate {color: #663399; font-size: 20px; font-weight: bold; font-family: sans-serif; letter-spacing: 2px; border-bottom: #224466 solid 1pt; margin-left:80pt; margin-top:20px;} +div.roomsubject {color: #336699; font-size: 18px; font-family: sans-serif; margin-left: 80pt; margin-bottom: 10px;} +div.rc {color: #336699; font-size: 12px; font-family: sans-serif; margin-left: 50%; text-align: right; background: #f3f6f9; border-bottom: 1px solid #336699; border-right: 4px solid #336699;} +div.rct {font-weight: bold; background: #e3e6e9; padding-right: 10px;} +div.rcos {padding-right: 10px;} +div.rcoe {color: green;} +div.rcod {color: red;} +div.rcoe:after {content: ": v";} +div.rcod:after {content: ": x";} +div.rcot:after {} +.legend {width: 100%; margin-top: 30px; border-top: #224466 solid 1pt; padding: 10px 0px 10px 0px; text-align: left; font-family: monospace; letter-spacing: 2px;} +.w3c {position: absolute; right: 10px; width: 60%; text-align: right; font-family: monospace; letter-spacing: 1px;} diff --git a/priv/css/oauth.css b/priv/css/oauth.css new file mode 100644 index 000000000..41112f39c --- /dev/null +++ b/priv/css/oauth.css @@ -0,0 +1,103 @@ +body { + margin: 0; + padding: 0; + + font-family: sans-serif; + color: #fff; +} + +h1 { + font-size: 3em; + color: #444; +} + +p { + line-height: 1.5em; + color: #888; +} + +a { + color: #fff; +} +a:hover, +a:active { + text-decoration: underline; +} + +em { + display: inline-block; + padding: 0 5px; + background: #f4f4f4; + border-radius: 5px; + font-style: normal; + font-weight: bold; + color: #444; +} + +form { + color: #444; +} +label { + display: block; + font-weight: bold; +} + +input[type=text], +input[type=password] { + margin-bottom: 1em; + padding: 0.4em; + max-width: 330px; + width: 100%; + border: 1px solid #c4c4c4; + border-radius: 5px; + outline: 0; + font-size: 1.2em; +} +input[type=text]:focus, +input[type=password]:focus, +input[type=text]:active, +input[type=password]:active { + border-color: #41AFCA; +} + +input[type=submit] { + font-size: 1em; +} + +.container { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: #424A55; + background-image: -webkit-linear-gradient(270deg, rgba(48,52,62,0) 24%, #30353e 100%); + background-image: linear-gradient(-180deg, rgba(48,52,62,0) 24%, #30353e 100%); +} + +.section { + padding: 3em; +} +.white.section { + background: #fff; + border-bottom: 4px solid #41AFCA; +} + +.white.section a { + text-decoration: none; + color: #41AFCA; +} +.white.section a:hover, +.white.section a:active { + text-decoration: underline; +} + +.container > .section { + background: #424A55; +} + +.block { + margin: 0 auto; + max-width: 900px; + width: 100%; +} diff --git a/priv/img/admin-logo-fill.png b/priv/img/admin-logo-fill.png new file mode 100644 index 0000000000000000000000000000000000000000..862163c504494e431ba84cbd8faa3af1b3069e10 GIT binary patch literal 177 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 literal 0 HcmV?d00001 diff --git a/priv/img/bosh-logo.png b/priv/img/bosh-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..25a46f9f9ef81e7cd3291ba82f92fe373dba8c04 GIT binary patch literal 5615 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 FI0FzohAjX9 literal 0 HcmV?d00001 diff --git a/priv/img/oauth-logo.png b/priv/img/oauth-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..25a46f9f9ef81e7cd3291ba82f92fe373dba8c04 GIT binary patch literal 5615 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 literal 0 HcmV?d00001 diff --git a/priv/img/vcss.png b/priv/img/vcss.png new file mode 100644 index 0000000000000000000000000000000000000000..9b2f596e016533327216d98a0a927738fe17384f GIT binary patch literal 1134 zcmeAS@N?(olHy`uVBq!ia0vp^5kM@@!3-or#C~03U|`e?@Ck7Ra+Q_kdEDnlhI%!W zMb4c&_g;@{HxGAjZ*NM+!7cOCYk@#Y{Pps{+}zwx_wR4FlUu4N92*~!s#T`6W<+- zt4%e$w+9&~i2E*D*W)T9Bhx(p?A&_0|7X(X^Ya7IW>?MPDaUzu zczTO0wr<^e|Jf%QG42CClNSR6E4d`dFZlmw6q^`8Jh0FrC=HPY3SEXN1j@jH0f@DT z;lF?am<8g&3^agg*jyz(n}LC8qNj^vNX4zUQ)`1SI|v-Rel?4G(T!h0t6h3r9Tx_% z{GPN=z+e1GN8qGw>eHn5|8FmNua|o1m5;W_zoO+QbMz<2znfQG#(ynM{=I#{0V!X> zqF)tO-~TK+p#QH~U+~Uxw*7OC?@4lzU=MuwAfY=*I-PyJf}6|jF4ry6#nK@bObtKJ z{jpr)a7XQvK=_v<_kY&OUtDf7N2Y`!=sAP5DASo0{WX7G;uf&=`Gs|Enroa;cP#bwBZgT0Vk8}Ij!pi@+JzOex~wA_|LQI>iZ4KOPMZj@RJmq z{=ckJgo`sg=^ee+rLf!@|1r#|1Qou-tz zozY_28jcOAqH_ZHT>9G+6r2tD{%tx^c*pF4-nNSOH_A#)UvDaE^>6pwzeB^b1utmshBn2mW1YZ#q&(r+Ne9lLHSPV z;lJMu*6nF1eX&Vu#au@n)2h{;1^hB;>x|=8`0r4N5Dq`3W>NpNuIHfS-r}72x2dtZ z|1vypS3P_!s?6%3q3f=mrP_V^@twUAXY`EwoTZxX&st-k^Kye`&fdVV(2iA`qSwCa zO3SD?y)^LM2F^-1=1_^hVN1d%c)e7=87<81^0{cK;`g>k^UAjGxu$SW%#%-OqR3cMOS7CD$Nw90jSF7TjZ+3b%7?`))PKP%lew!LZ} z9@4ntXMQ2~DY0cQL^+Gz9jsW~FI2w%Uw?1i^C{7@K5}j{esbPgg&e IbxsLQ074N#oB#j- literal 0 HcmV?d00001 diff --git a/priv/js/admin.js b/priv/js/admin.js new file mode 100644 index 000000000..d726e42c9 --- /dev/null +++ b/priv/js/admin.js @@ -0,0 +1,15 @@ + +function selectAll() { + for(i=0;i ]. css() -> - <<" - body { - margin: 0; - padding: 0; - - font-family: sans-serif; - color: #fff; - } - - h1 { - font-size: 3em; - color: #444; - } - - p { - line-height: 1.5em; - color: #888; - } - - a { - color: #fff; - } - a:hover, - a:active { - text-decoration: underline; - } - - em { - display: inline-block; - padding: 0 5px; - - background: #f4f4f4; - border-radius: 5px; - - font-style: normal; - font-weight: bold; - color: #444; - } - - form { - color: #444; - } - label { - display: block; - font-weight: bold; - } - - input[type=text], - input[type=password] { - margin-bottom: 1em; - padding: 0.4em; - - max-width: 330px; - width: 100%; - - border: 1px solid #c4c4c4; - border-radius: 5px; - outline: 0; - - font-size: 1.2em; - } - input[type=text]:focus, - input[type=password]:focus, - input[type=text]:active, - input[type=password]:active { - border-color: #41AFCA; - } - - input[type=submit] { - font-size: 1em; - } - - .container { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - - background: #424A55; - background-image: -webkit-linear-gradient(270deg, rgba(48,52,62,0) 24%, #30353e 100%); - background-image: linear-gradient(-180deg, rgba(48,52,62,0) 24%, #30353e 100%); - } - - .section { - padding: 3em; - } - .white.section { - background: #fff; - border-bottom: 4px solid #41AFCA; - } - - .white.section a { - text-decoration: none; - color: #41AFCA; - } - .white.section a:hover, - .white.section a:active { - text-decoration: underline; - } - - .container > .section { - background: #424A55; - } - - .block { - margin: 0 auto; - max-width: 900px; - width: 100%; - } -">>. + case misc:read_css("oauth.css") of + {ok, Data} -> Data; + {error, _} -> <<>> + end. logo() -> - <<"data:image/png;base64,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">>. + case misc:read_img("oauth-logo.png") of + {ok, Img} -> + B64Img = base64:encode(Img), + <<"data:image/png;base64,", B64Img/binary>>; + {error, _} -> + <<>> + end. -spec opt_type(oauth_expire) -> fun((non_neg_integer()) -> non_neg_integer()); (oauth_access) -> fun((any()) -> any()); diff --git a/src/ejabberd_web_admin.erl b/src/ejabberd_web_admin.erl index 464ea6bfd..b3d72c19b 100644 --- a/src/ejabberd_web_admin.erl +++ b/src/ejabberd_web_admin.erl @@ -372,311 +372,37 @@ get_base_path(Host, Node) -> %%%% css & images additions_js() -> - <<"\nfunction selectAll() {\n for(i=0;i>. + case misc:read_js("admin.js") of + {ok, JS} -> JS; + {error, _} -> <<>> + end. css(Host) -> - Base = get_base_path(Host, cluster), - <<"html,body {\n" - " margin: 0;\n" - " padding: 0;\n" - " height: 100%;\n" - " background: #f9f9f9;\n" - " font-family: sans-serif;\n" - "}\n" - "body {\n" - " min-width: 990px;\n" - "}\n" - "a {\n" - " text-decoration: none;\n" - " color: #3eaffa;\n" - "}\n" - "a:hover,\n" - "a:active {\n" - " text-decoration: underline;\n" - "}\n" - "#container {\n" - " position: relative;\n" - " padding: 0;\n" - " margin: 0 auto;\n" - " max-width: 1280px;\n" - " min-height: 100%;\n" - " height: 100%;\n" - " margin-bottom: -30px;\n" - " z-index: 1;\n" - "}\n" - "html>body #container {\n" - " height: auto;\n" - "}\n" - "#header h1 {\n" - " width: 100%;\n" - " height: 50px;\n" - " padding: 0;\n" - " margin: 0;\n" - " background-color: #49cbc1;\n" - "}\n" - "#header h1 a {\n" - " position: absolute;\n" - " top: 0;\n" - " left: 0;\n" - " width: 100%;\n" - " height: 50px;\n" - " padding: 0;\n" - " margin: 0;\n" - " background: url('",Base/binary,"logo.png') 10px center no-repeat transparent;\n" - " background-size: auto 25px;\n" - " display: block;\n" - " text-indent: -9999px;\n" - "}\n" - "#clearcopyright {\n" - " display: block;\n" - " width: 100%;\n" - " height: 30px;\n" - "}\n" - "#copyrightouter {\n" - " position: relative;\n" - " display: table;\n" - " width: 100%;\n" - " height: 30px;\n" - " z-index: 2;\n" - "}\n" - "#copyright {\n" - " display: table-cell;\n" - " vertical-align: bottom;\n" - " width: 100%;\n" - " height: 30px;\n" - "}\n" - "#copyright a {\n" - " font-weight: bold;\n" - " color: #fff;\n" - "}\n" - "#copyright p {\n" - " margin-left: 0;\n" - " margin-right: 0;\n" - " margin-top: 5px;\n" - " margin-bottom: 0;\n" - " padding-left: 0;\n" - " padding-right: 0;\n" - " padding-top: 5px;\n" - " padding-bottom: 5px;\n" - " width: 100%;\n" - " color: #fff;\n" - " background-color: #30353E;\n" - " font-size: 0.75em;\n" - " text-align: center;\n" - "}\n" - "#navigation {\n" - " display: inline-block;\n" - " vertical-align: top;\n" - " width: 30%;\n" - "}\n" - "#navigation ul {\n" - " padding: 0;\n" - " margin: 0;\n" - " width: 90%;\n" - " background: #fff;\n" - "}\n" - "#navigation ul li {\n" - " list-style: none;\n" - " margin: 0;\n" - "\n" - " border-bottom: 1px solid #f9f9f9;\n" - " text-align: left;\n" - "}\n" - "#navigation ul li a {\n" - " margin: 0;\n" - " display: inline-block;\n" - " padding: 10px;\n" - " color: #333;\n" - "}\n" - "ul li #navhead a, ul li #navheadsub a, ul li #navheadsubsub a {\n" - " font-size: 1.5em;\n" - " color: inherit;\n" - "}\n" - "#navitemsub {\n" - " border-left: 0.5em solid #424a55;\n" - "}\n" - "#navitemsubsub {\n" - " border-left: 2em solid #424a55;\n" - "}\n" - "#navheadsub,\n" - "#navheadsubsub {\n" - " padding-left: 0.5em;\n" - "}\n" - "#navhead,\n" - "#navheadsub,\n" - "#navheadsubsub {\n" - " border-top: 3px solid #49cbc1;\n" - " background: #424a55;\n" - " color: #fff;\n" - "}\n" - "#lastactivity li {\n" - " padding: 2px;\n" - " margin-bottom: -1px;\n" - "}\n" - "thead tr td {\n" - " background: #3eaffa;\n" - " color: #fff;\n" - "}\n" - "thead tr td a {\n" - " color: #fff;\n" - "}\n" - "td.copy {\n" - " text-align: center;\n" - "}\n" - "tr.head {\n" - " color: #fff;\n" - " background-color: #3b547a;\n" - " text-align: center;\n" - "}\n" - "tr.oddraw {\n" - " color: #412c75;\n" - " background-color: #ccd4df;\n" - " text-align: center;\n" - "}\n" - "tr.evenraw {\n" - " color: #412c75;\n" - " background-color: #dbe0e8;\n" - " text-align: center;\n" - "}\n" - "td.leftheader {\n" - " color: #412c75;\n" - " background-color: #ccccc1;\n" - " padding-left: 5px;\n" - " padding-top: 2px;\n" - " padding-bottom: 2px;\n" - " margin-top: 0px;\n" - " margin-bottom: 0px;\n" - "}\n" - "td.leftcontent {\n" - " color: #000044;\n" - " background-color: #e6e6df;\n" - " padding-left: 5px;\n" - " padding-right: 5px;\n" - " padding-top: 2px;\n" - " padding-bottom: 2px;\n" - " margin-top: 0px;\n" - " margin-bottom: 0px;\n" - "}\n" - "td.rightcontent {\n" - " color: #000044;\n" - " text-align: justify;\n" - " padding-left: 10px;\n" - " padding-right: 10px;\n" - " padding-bottom: 5px;\n" - "}\n" - "\n" - "h1 {\n" - " color: #000044;\n" - " padding-top: 2px;\n" - " padding-bottom: 2px;\n" - " margin-top: 0px;\n" - " margin-bottom: 0px;\n" - "}\n" - "h2 {\n" - " color: #000044;\n" - " text-align: center;\n" - " padding-top: 2px;\n" - " padding-bottom: 2px;\n" - " margin-top: 0px;\n" - " margin-bottom: 0px;\n" - "}\n" - "h3 {\n" - " color: #000044;\n" - " text-align: left;\n" - " padding-top: 20px;\n" - " padding-bottom: 2px;\n" - " margin-top: 0px;\n" - " margin-bottom: 0px;\n" - "}\n" - "#content ul {\n" - " padding-left: 1.1em;\n" - " margin-top: 1em;\n" - "}\n" - "#content ul li {\n" - " list-style-type: disc;\n" - " padding: 5px;\n" - "}\n" - "#content ul.nolistyle>li {\n" - " list-style-type: none;\n" - "}\n" - "#content {\n" - " display: inline-block;\n" - " vertical-align: top;\n" - " padding-top: 25px;\n" - " width: 70%;\n" - "}\n" - "div.guidelink,\n" - "p[dir=ltr] {\n" - " display: inline-block;\n" - " float: right;\n" - "\n" - " margin: 0;\n" - " margin-right: 1em;\n" - "}\n" - "div.guidelink a,\n" - "p[dir=ltr] a {\n" - " display: inline-block;\n" - " border-radius: 3px;\n" - " padding: 3px;\n" - "\n" - " background: #3eaffa;\n" - "\n" - " text-transform: uppercase;\n" - " font-size: 0.75em;\n" - " color: #fff;\n" - "}\n" - "table {\n" - " margin-top: 1em;\n" - "}\n" - "table tr td {\n" - " padding: 0.5em;\n" - "}\n" - "table tr:nth-child(odd) {\n" - " background: #fff;\n" - "}\n" - "table.withtextareas>tbody>tr>td {\n" - " vertical-align: top;\n" - "}\n" - "textarea {\n" - " margin-bottom: 1em;\n" - "}\n" - "input,\n" - "select {\n" - " font-size: 1em;\n" - "}\n" - "p.result {\n" - " border: 1px;\n" - " border-style: dashed;\n" - " border-color: #FE8A02;\n" - " padding: 1em;\n" - " margin-right: 1em;\n" - " background: #FFE3C9;\n" - "}\n" - "*.alignright {\n" - " text-align: right;\n" - "}">>. + case misc:read_css("admin.css") of + {ok, CSS} -> + Base = get_base_path(Host, cluster), + re:replace(CSS, <<"@BASE@">>, Base, [{return, binary}]); + {error, _} -> + <<>> + end. favicon() -> - base64:decode(<<"AAABAAEAEBAAAAEAIAAoBQAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAA1AwMAQwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMARQUEA+oFAwCOBAQAaAQEAGkEBABpBAQAaQQEAGoFAgBcBAAAOQAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAEIHBgX/BwYF/wcGBf8HBgX/BwYF/wcGBf8HBgX/BwYF/wUFA/wEBAHOBQICXgAAAAAAAAAAAAAAAAAAAAADAwBCBwYF/wcGBf8HBgX/BwYF/wcGBf8HBgX/BwYF/wcGBf8HBgX/BwYF/wcGBf8DAwCUAAAABwAAAAAAAAAAAwMAQgcGBf8HBgX/BwYF/wcGBf8FBQPMBAAAaAQAAD8DAwNOAwMDlgUFA/QHBgX/BwYF/wQEAHkAAAAAAAAAAAMDAEIHBgX/BwYF/wcGBf8EBAGeAAAACAAAAAAAAAASAAAABQAAAAAFBQGxBwYF/wcGBf8FBAPvAAAAKAAAAAADAwBCBwYF/wcGBf8EBAHPAAAADQAAACEFBQGuBQQD8AUEAeEFBQGuBQQB9QcGBf8HBgX/BwYF/wQEAH8AAAAAAwMAQgcGBf8HBgX/BgQAbwAAAAADAwOXBQQB3gUFAdgFBQHZBQQB3QUFAdYFBAHhBQUD/gcGBf8EBAK8AAAAAAMDAEIHBgX/BwYF/wQAAD0AAAAAAAAABQAAAAEAAAABAAAAAQAAAAEAAAAFAAAAEQUFArwKBgX/BQMDxQAAAAADAwBCBwYF/wcGBf8DAwBKAAAAAwYDAFAGAwBVBgMAVAYDAFQFAgJZAAAALwAAAAAFBQGuCgYF/wUDA8QAAAAAAAAAKwUEA/QHBgX/AwMDlgAAAAAFAwOIBwYF/wcGBf8HBgX/BQQB5wAAADMAAAAWBQUD5wcGBf8EBAGbAAAAAAAAAAYFBAG9BwYF/wUFA/EDAABAAAAAAAMDA1QDAwOYBQUAhQAAACQAAAAABAQBnQcGBf8HBgX/AwMATQAAAAAAAAAAAwAAQwUFA/oHBgX/BQQB5QYDA1UAAAAAAAAAAAAAAAAAAAAXAwMAlwcGBf8HBgX/BQUBtQAAAAcAAAAAAAAAAAAAAAAEBABzBQUD/gcGBf8HBgX/BQMDyQQEAZwGBAGqBQQB5AcGBf8HBgX/BAQB0QAAACEAAAAAAAAAAAAAAAAAAAAAAAAAAAUFAmQFBAHlBwYF/wcGBf8HBgX/BwYF/wcGBf8FBQP+BQUBsAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwUFA40FBAHrBwYF/wUFA/4FAwPGBgMAUgAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==">>). + case misc:read_img("favicon.png") of + {ok, ICO} -> ICO; + {error, _} -> <<>> + end. logo() -> - base64:decode(<<"iVBORw0KGgoAAAANSUhEUgAAA64AAADICAYAAADoQ7yoAAAKQWlDQ1BJQ0MgUHJvZmlsZQAASA2dlndUU9kWh8+9N73QEiIgJfQaegkg0jtIFQRRiUmAUAKGhCZ2RAVGFBEpVmRUwAFHhyJjRRQLg4Ji1wnyEFDGwVFEReXdjGsJ7601896a/cdZ39nnt9fZZ+9917oAUPyCBMJ0WAGANKFYFO7rwVwSE8vE9wIYEAEOWAHA4WZmBEf4RALU/L09mZmoSMaz9u4ugGS72yy/UCZz1v9/kSI3QyQGAApF1TY8fiYX5QKUU7PFGTL/BMr0lSkyhjEyFqEJoqwi48SvbPan5iu7yZiXJuShGlnOGbw0noy7UN6aJeGjjAShXJgl4GejfAdlvVRJmgDl9yjT0/icTAAwFJlfzOcmoWyJMkUUGe6J8gIACJTEObxyDov5OWieAHimZ+SKBIlJYqYR15hp5ejIZvrxs1P5YjErlMNN4Yh4TM/0tAyOMBeAr2+WRQElWW2ZaJHtrRzt7VnW5mj5v9nfHn5T/T3IevtV8Sbsz55BjJ5Z32zsrC+9FgD2JFqbHbO+lVUAtG0GQOXhrE/vIADyBQC03pzzHoZsXpLE4gwnC4vs7GxzAZ9rLivoN/ufgm/Kv4Y595nL7vtWO6YXP4EjSRUzZUXlpqemS0TMzAwOl89k/fcQ/+PAOWnNycMsnJ/AF/GF6FVR6JQJhIlou4U8gViQLmQKhH/V4X8YNicHGX6daxRodV8AfYU5ULhJB8hvPQBDIwMkbj96An3rWxAxCsi+vGitka9zjzJ6/uf6Hwtcim7hTEEiU+b2DI9kciWiLBmj34RswQISkAd0oAo0gS4wAixgDRyAM3AD3iAAhIBIEAOWAy5IAmlABLJBPtgACkEx2AF2g2pwANSBetAEToI2cAZcBFfADXALDIBHQAqGwUswAd6BaQiC8BAVokGqkBakD5lC1hAbWgh5Q0FQOBQDxUOJkBCSQPnQJqgYKoOqoUNQPfQjdBq6CF2D+qAH0CA0Bv0BfYQRmALTYQ3YALaA2bA7HAhHwsvgRHgVnAcXwNvhSrgWPg63whfhG/AALIVfwpMIQMgIA9FGWAgb8URCkFgkAREha5EipAKpRZqQDqQbuY1IkXHkAwaHoWGYGBbGGeOHWYzhYlZh1mJKMNWYY5hWTBfmNmYQM4H5gqVi1bGmWCesP3YJNhGbjS3EVmCPYFuwl7ED2GHsOxwOx8AZ4hxwfrgYXDJuNa4Etw/XjLuA68MN4SbxeLwq3hTvgg/Bc/BifCG+Cn8cfx7fjx/GvyeQCVoEa4IPIZYgJGwkVBAaCOcI/YQRwjRRgahPdCKGEHnEXGIpsY7YQbxJHCZOkxRJhiQXUiQpmbSBVElqIl0mPSa9IZPJOmRHchhZQF5PriSfIF8lD5I/UJQoJhRPShxFQtlOOUq5QHlAeUOlUg2obtRYqpi6nVpPvUR9Sn0vR5Mzl/OX48mtk6uRa5Xrl3slT5TXl3eXXy6fJ18hf0r+pvy4AlHBQMFTgaOwVqFG4bTCPYVJRZqilWKIYppiiWKD4jXFUSW8koGStxJPqUDpsNIlpSEaQtOledK4tE20Otpl2jAdRzek+9OT6cX0H+i99AllJWVb5SjlHOUa5bPKUgbCMGD4M1IZpYyTjLuMj/M05rnP48/bNq9pXv+8KZX5Km4qfJUilWaVAZWPqkxVb9UU1Z2qbapP1DBqJmphatlq+9Uuq43Pp893ns+dXzT/5PyH6rC6iXq4+mr1w+o96pMamhq+GhkaVRqXNMY1GZpumsma5ZrnNMe0aFoLtQRa5VrntV4wlZnuzFRmJbOLOaGtru2nLdE+pN2rPa1jqLNYZ6NOs84TXZIuWzdBt1y3U3dCT0svWC9fr1HvoT5Rn62fpL9Hv1t/ysDQINpgi0GbwaihiqG/YZ5ho+FjI6qRq9Eqo1qjO8Y4Y7ZxivE+41smsImdSZJJjclNU9jU3lRgus+0zwxr5mgmNKs1u8eisNxZWaxG1qA5wzzIfKN5m/krCz2LWIudFt0WXyztLFMt6ywfWSlZBVhttOqw+sPaxJprXWN9x4Zq42Ozzqbd5rWtqS3fdr/tfTuaXbDdFrtOu8/2DvYi+yb7MQc9h3iHvQ732HR2KLuEfdUR6+jhuM7xjOMHJ3snsdNJp9+dWc4pzg3OowsMF/AX1C0YctFx4bgccpEuZC6MX3hwodRV25XjWuv6zE3Xjed2xG3E3dg92f24+ysPSw+RR4vHlKeT5xrPC16Il69XkVevt5L3Yu9q76c+Oj6JPo0+E752vqt9L/hh/QL9dvrd89fw5/rX+08EOASsCegKpARGBFYHPgsyCRIFdQTDwQHBu4IfL9JfJFzUFgJC/EN2hTwJNQxdFfpzGC4sNKwm7Hm4VXh+eHcELWJFREPEu0iPyNLIR4uNFksWd0bJR8VF1UdNRXtFl0VLl1gsWbPkRoxajCCmPRYfGxV7JHZyqffS3UuH4+ziCuPuLjNclrPs2nK15anLz66QX8FZcSoeGx8d3xD/iRPCqeVMrvRfuXflBNeTu4f7kufGK+eN8V34ZfyRBJeEsoTRRJfEXYljSa5JFUnjAk9BteB1sl/ygeSplJCUoykzqdGpzWmEtPi000IlYYqwK10zPSe9L8M0ozBDuspp1e5VE6JA0ZFMKHNZZruYjv5M9UiMJJslg1kLs2qy3mdHZZ/KUcwR5vTkmuRuyx3J88n7fjVmNXd1Z752/ob8wTXuaw6thdauXNu5Tnddwbrh9b7rj20gbUjZ8MtGy41lG99uit7UUaBRsL5gaLPv5sZCuUJR4b0tzlsObMVsFWzt3WazrWrblyJe0fViy+KK4k8l3JLr31l9V/ndzPaE7b2l9qX7d+B2CHfc3em681iZYlle2dCu4F2t5czyovK3u1fsvlZhW3FgD2mPZI+0MqiyvUqvakfVp+qk6oEaj5rmvep7t+2d2sfb17/fbX/TAY0DxQc+HhQcvH/I91BrrUFtxWHc4azDz+ui6rq/Z39ff0TtSPGRz0eFR6XHwo911TvU1zeoN5Q2wo2SxrHjccdv/eD1Q3sTq+lQM6O5+AQ4ITnx4sf4H++eDDzZeYp9qukn/Z/2ttBailqh1tzWibakNml7THvf6YDTnR3OHS0/m/989Iz2mZqzymdLz5HOFZybOZ93fvJCxoXxi4kXhzpXdD66tOTSna6wrt7LgZevXvG5cqnbvfv8VZerZ645XTt9nX297Yb9jdYeu56WX+x+aem172296XCz/ZbjrY6+BX3n+l37L972un3ljv+dGwOLBvruLr57/17cPel93v3RB6kPXj/Mejj9aP1j7OOiJwpPKp6qP6391fjXZqm99Oyg12DPs4hnj4a4Qy//lfmvT8MFz6nPK0a0RupHrUfPjPmM3Xqx9MXwy4yX0+OFvyn+tveV0auffnf7vWdiycTwa9HrmT9K3qi+OfrW9m3nZOjk03dp76anit6rvj/2gf2h+2P0x5Hp7E/4T5WfjT93fAn88ngmbWbm3/eE8/syOll+AABAAElEQVR4Ae19CbgdVZVu1c0EGclMBsgNDUHRACKgQpjs0D6FqK0tCCqE9mt8HezXdjO07XvdBAdsIXwP+zUI2D4GWxB8ditBWwFBQoBWEAjYCjTk3oQMZCBzbpKb5Nb717nnhDucc24Ne+3au+rf37fuuadq1xr+tavOXnuvvSsMWIiA5whEUTQMJgytmjEYn/uCINwRhkHkuWlU3zME0BZDFLY7z/yWRl36Og1qvIYIEAEiQATKjID8dor97CuVuRWU0HY0/OGgRXvxp0m5G+cmlhAemqyMANrVNNDdTdpfG87PB8lACovHCMCH9LXH/qPqRIAIEAEikC8C+B0dBVoI2gyqV9pwUM6PyldTSicCCghUGzc+4pbOWxXUIMsSIoAWN2x7FD0ft+VV680vIVTem0xfe+9CGkAEiAARIAI5I7ALg/zJ+kzss+fsMoo3hcAazLKuS9b6e9SWK9cMN6UL+ZQPATSg2T0aVMJ/Ny0uH2L+Wkxf++s7ak4EiAARIAIOIICMs/R99k34GWaf3QEvUoW0CKAFj8WoTcayDdfzRkjrgzJfh5TguRkbHy5/g8GrB42IvvbASVSRCBABIkAE3EUgilrSB6213lal1z/WXSOpGRFohAAWcme/AWo3wvLNjcTwOBGoh0BH9xrHWgPK+LlxQT0ZPOYGAvS1G36gFkSACBABIuAvAq8lX1LVoG8lM69Bi79IUPNSIrAcmzA1aNEpD2+YV0ogaXQqBFanbGX1L5PtnJZy84FUntC/iL7Wx5gSiAARIAJEoLgIbDSSodazB7WC2WrFbS4FtAzrWqWrb7as5utKCthUNEzCA3iB2bYn3PgQ1vBVVp70dVYEeT0RIAJEgAiUHQFzGZK9el+tZceV9nuCQHsUXdmr6Zr7MssTCKhmjggoPYClFXPWNUe/1hNNX9dDhceIABEgAkSACMRDwPxsa63T3/ZYTQPmDdeQ4KerCCitCVx5oasGUy83EFiLdwBPUlPlzc+osSbjxAjQ14kh4wVEgAgQASJABHohsDUIFvU6YOzLmNOx1jUUdoON8SQjImAaAexKNi4IWk2z7ea392J8LtThTa5FQGBXEJylZ8euS8H7Zj3+5JwEAfo6CVqsWyYEMN8hu3oeXaUZ+BwNkoyRkdVP+b8n4WuwvQ/t6PF9G/5fAXoF9HIYhpvwyUIEiIDvCGAjVTwsjtMxQx5D0SFBEG5m4KqDMLmaQSDaZ4ZPHS7DMDDEQgQaI4B0lAmNz2Y+Ix1AFkcQoK8dcQTVyA0BBKhHQPhskASpspSmFqxOxP9Jy5S4F0DuRtR9uQ+9iIB2eVwerEcEiED+CCzFYJaMYCmWMeDNwFURYLJ2GoE9cgOwEIGcEBhziGzxHoZBV04KUKw1BOhra1BTUGwEEDAehsqSVfL+6ufhsS82W1EGCIVO7ckW+r2O74+AHpVPBLLynYUIEAFHEZgWBONtzIbakOEoxFSLCBABIkAEiAARIALFRwCBoCzZrwWp8nmk41ZLYC1LeoQC6P8qPipBrHwikF0nx1mIABFwA4HJQbDXhiYMXG2gTBmpEdBroEwVTu0UXkgEiAARIALOI4BgbwSU/BhINoP7Q1ALyNcigbbQn4G6YJvMxn4X9K8IYmUNLQsRIAIlQMDnh1gJ3FNyE8MwwkLUZToo7P+eDl9yJQJEgAgQASKQDwII6FpAZ4PuggYyKymfZ4OK1N8TW+aC7gS9AVu/W7W5SDbCNBYiQAT6IsCbvC8i/O4UAgcHwY06CkU/0OFLrkSACBABIkAE7CKAwO0Y0HWQKmtBHwTJLKvMuBa9iI2fBonNrwOD60HvKLrRtI8IlBUBBq5l9bwndmPHhrtkX32zZdWWMJzZbpYnuREBIkAEiAARsIsAgrSTQT+G1N+CrgRNtauBU9LE9itALwKT+0HvcUo7KkMEiEBmBBi4ZoaQDFQRCMOuziC4xKyMSNKmWIgAESACRIAIeIkAgrIzQQ9B+V+BPgwKvTRER2nBYh7oP4DRw6CzdMSQKxEgArYRYOBqG3HKS4zAhDC8oy0ItiS+sO4Fa5eE4eHP1D3Fg0SACBABIkAEHEYAQdiHQE9ARdlhV9Z5sjRHQDalegSYPQk6p3lVniUCRMB1BBi4uu4h6ldB4IggmLg+MxYrwGHqmZnZkAERIAJEgAgQAYsIIOiSDZeehcifgE6xKLooot4HQx4Ahs+B/qgoRtEOIlA2BBi4ls3jvtobhvsmY897rHddks6E9diduLUlDIMo3fW8iggQASJABIiAXQQQZE0D3QupD4LeZVd6IaUdD6t+DkzvA00vpIU0iggUGAEGrgV2bhFNGx2GZ8Cus/clM+6SMJx8PIPWZKCxNhEgAkSACOSDAIKqwaDLIf0l0Hn5aFFoqZ+Adb8HxlcI1oW2lMYRgQIhwMC1QM4siymYeH14CP7A3rMxfdroPa/tOH8ZSKregU8WIkAEiAARIALOI4BA6jQo+RxoEWik8wr7q6Bgez3oeWB+ur9mUHMiUB4EOMpUHl8XzlIJYGGUpP0E+NHpOQgT4RxTggvncRpEBIgAESguAvgdwxvgghtAFxXXSictk/e+Pgb8/wWff4X+w0YntaRSRIAIBD07+4SDCHiLAH5ounoQg1ZvPUnFiQARIALlQwBBk8yyPg9i0Jqf+z8N0cvgC86+5ucDSiYCTRFg4NoUHp4kAkSACBABIkAEiIAOAgiSQtCXwP1R0DQdKeSaAIGpqCuvz/lfIPaREwDHqkTABgK8KW2gTBlEgAgQASJABIgAEeiBAAKjSfj6M9DXQIN6nOK/+SIgvvgKSHYfnpyvKpROBIhATwQYuPZEg/8TASJABIgAESACREAZAQREZ0KEpAbznaLKWGdgP1d8BF+dlYEHLyUCRMAgAgxcDYJJVkSACBABIkAEiAARaIYAAqG/w/lfgKY0q8dzTiBwKLR4GD77e5C8zYCFCBCBHBFg4Joj+BRNBIgAESACRIAIlAMBBD7ybtbbYe2XQex/+eN28dU1oDvEh/6oTU2JQPEQ4IOzeD6lRUSACBABIkAEiIBDCCDgGQ51fgSa75BaVCUZArLj84+rvkx2JWsTASJgBAEGrkZgJBMiQASIABEgAkSACPRHAIHOOByV946f0/8sj3iGwIeg7y/g0/Ge6U11iUAhEGDgWgg30ggiQASIABEgAkTANQQQ4EyHTo+D3ueabtQnNQLvxZWPw7eHpebAC4kAEUiFAAPXVLDxIiJABIgAESACRIAINEYAgc0xOPskSD5ZioXA22HOk/DxO4plFq0hAm4jwMDVbf9QOyJABIgAESACRMAzBKoBjcy0clbOM98lUFdm05fA1+9McA2rEgEikAGBQuyOhoeGbFF+MEhe5i0PkqmgCdXv+AhmgdaAdoB2gjaAVoFWVv/fGoZhF/5nIQKlQAD3jAxaCQ1qYvBe3hdN0PH0VAPf74c5XfS3p05toDZ93QAY5cPA/XCI+DlI1rayFBsB8fHP4fNT8PxcUWxTaZ0rCKC9Sdwj1LcfJ7/l+9EWI1d0Na2Hl4ErHDYWQMwBXQD6IOgQUKYSRXtx/eAl+HMv6KeglezEAQVHC9qA7NA4H3TpviA4bnCwd0sQDAHta636cRHu6Z+EYVDKAYnqQ03uiz8AnQyS++WYbqzwX8wCPlITuAYvgJ4GPQZ6FrSW9wdQcLDAZ8Oglrwfcjbo3VWSGYFWUNPS7W+0kmBwO/48BVoK+jXoNdCWIv8Ywj7vCn3tnsvgExk0fxA0zT3t1DTqBOdtoO2gXaARoNGgUSAv+5nQO0mRyZIH4ftT8YzcmORC1m2OADCVvt500NEg+T2TiShJvR8Dkj6OkPRR5LfqG8BfPgtRYLsEpbIJ2HEg6cOJ/Ql+yyu4rMA1vwM9V6Xf43MdcJIfei+LROvOFzhPHnxngv4SdC7IVlkGQdeC/h1OlgcyS94IoC1gOOku3M0yaBGnnA/f3Renos91qveIrLn5OOhiUCtIuVQGC74DIbeBXgXOhRokaI+iBTOC4CYdEOVxMnpQ1oGVqt+PALOPgD4Fkh84zSLPxO+BfgBaAZ8XYlSXvq7bZArp67qWGjqI+1ECtkdAMlhYpCLZai+BpNNbI/m+AbQdzwEJXOsWYCLZcBLEHgaSgKMnzcR36ZwXpTwDQ84CHoIXS0IE0FZk0FUC0wz9mMrA69nwwcMJxedevfp7Lv24izGV9tkhBiblGhtVwekBnP8h6CHQGmCW6fe8I4qm4WZf1Vhm5jMzoWN7Zi5qDDANDifO6Yqi5/HpQOncDCXOA8mNxZIDAsB+9t5ULWET2lAlpSIHrfVEAorhIGmTjtwj0WPQZQ6oEB0RCWZgi1LZBr7pOmy4cBpoYWcUyTMp7yI+nwuSwUVvC30dqxkVwtdajRQIDgFJymgRyh4Y8Qjoi6B3gVQmOcB3NOiPQbeAcBsWosjM61CtdlY0vsBK6fdsw2M+YAX7R4Hmg9pAeRfpS4ouktWauEjgqmxAa2KlbFwAo8WJi5SNz8h+n/yAuwmgDSflIGN3FM3L5rR1uDxdoJCDuY1Fdg/ozEWvoi0bHupXL4aE1saGuH/GpWAGWMoPwq3qXssmQJ6Lkp7sXaGvEzveW19rNE6gF4LuToyiWxfsgDrfAZ0Lkplj6wVyjwZ9AfQsyOdyD5RXCfatO0VBILCp/J7tVffwakhwr98HpQaDztvpxuBzAy/skuNXgiTdP1axFbg6MzMCcGbJ7CrQkXUSl8dCKbdKg06H6LYoqszCzstNjZIIRttoxTT3/dnMnYTL18g6PS8LMJDZ1UXI4+iCAQ9hOLfVcUMkpR/3iMwsyqBD8Wa81fHv7gzPk5lVyJL0m0vVZWYTIM/FF8ThKDL4GPsHL5vYAlxNX/vuxGthQNzlK67ZKv2uBaCpSMP7LOgBkGxiab1A7sugG0EnQPhJoG+DfEy7/ST0/gcQSxUB/B4MAy2QcAiHKr9n+mk6svS4HavL3CgwXQL2xdAGmcDBvcNVU4Gz2nyQMLgOhE5cl8zEnpiVo6nrcw9cAcasrd0ds5cxPKW9PssUblU+Q2RR+P3Y2AlmROcZZk52ggA6dOsRAJkBY0prFG2UH2hvCtrV8P0YyYfC0pFwfECnHqyV2AWDDnsxLiWptwxg66HU6xhSrYHVldVBivt117n0kmzyi7RV/OBVslMmmmRcKF70tffuxL16Doz4G88Mkc78XaD3IEh8F+hbIJk0cKZAn2dAMlgnG819DvSKM8rFU0Rmq2zuyRJPK8u1gMG0fVEkabu7QTdVwiGrOsxAN/J16UPlVoDBiTK7CgUkYPewTYQSmz1dm4jIDciq4NwCVzhyLNIdZaTvZazalwDQ41IZN7o3iipT63M8NsQ51ZcHwfUyV2qujLgJwZP765S7U0kWwe6duEl9Hcnv4bbKPXJTNYCd3+ME/60h0D3rJgGrdCplpLMApZKdsr4awKZaN1MAEPqbQF/3x8TDI+jHTIfad4Iw7u5Fkdmu74OOQVB4MejXrmsNHXeAZAPAY0DzQegWeFGkTdyJNnK4F9oaVhJ2z5IlTWC7alAQSDZOjmX6BVG0YZZtBYDB7GrA+vRw7+McQa97IqIa68y1jWdNnv3AtfsHWzrkm4Z6N8Nag63RZ2Us6fEo2tKGBstOWiOY4h5H8IahVsOzjOKj5f8YV4U86qHtnIfehaSSGLY9D2v6yqwEsLdzkKc3LvD5XDi8C0cLErD2tg+vC5aOyybYiXW67q056qut5nf6WhNde7zhR3mYSRA43p7UTJJ+hKuPQxB4Aci32csAOsu7KWWQ4GiQzMSuBLlexkHB71fbiuu6GtEPtk6sTUqhj99qhKkRJjtfNsImBhNgUJuYe6EYAWtfoyuxzkNRtFU2iGzte1b7u9XAFQbO3tXdOStgh7ynq8aII6WTdmXPo/w/GQJrguC9ldsj2WUxao+41MWUVbSXidW0+XtjGOF5lYpnMcizXdZO4NletrIPHbFA0qfHvtmdQvRQJaQvPgzocEbIfo9KtDcAfV3QZv012HWqB7b9VvRE0PfHoBc90LepirBhH+jbqHQU6O9AkoLqcnkflPu6ywoa0Q2TUtiP4VbwWo+A1cFlf5Iy3Km+ThO/bQuBQQEn5uq1ktGSLdsWRfuxMV0QPhIEHfVqmT5mLXCtNugXdAIR07AY43ddFL0pIxLcpCQFpLgDFqS4LMYlknzcIav2nSnVh916/9Pmk0I6Un7gkE1TpkBGMBqLH9HK2uVNGJL3fKlEUp9X6mNvgMqghftp+6nM63kRfV00X+Pe/RA87PrAtAR0XwKdgEDvyZ4tsgj/w6ZO0Fdhy2zQLxy36XK0GQ/XNsZDFbadKBlD2I8BA5Mul7VXa2kHDFqxqYOk4qvJ0NI9O9+WC7ClRRcW+0tWh3pRD1zhx7Ey9eh+g9bCepx0SqU9l2iGwQyW6NEeY4ZTPS4dZ9c7avsY2sWoyot6Svmw64U2ApkNj7k4E95LS7Nf8LAvc6kMWuBNV9HcEqBAX2NmrAi+hg2yrvUukMvrWh+Gfu9EYPd1EGKK4hbY9ypIniEXgTY4amltvethjuqXTi3MsmLUeTEuftqPjKGDVAYPsD3rQmDQVu4Zqor1siRIvagGrnjAS7C2iYs9K35Ex3zr3eoeLZCATlVbduS+0ynuD9nIa5vZzadUQVNmPgEPvU2SPlvu578yyg6yl7UyfDY66BgFlYrg61uAi6vrWuVn8/MI5M4GvabgP2dZwt7vQrl3gB50VElZ7yqptIUo+J1ulaV/WOejEgzqgDRJMp2M9f3Aa9gbWOqDoL2Es6w6HorDVS1w3d6d635/HCXKU2c0djarpA6XID2uPF5NY2l1hO7xNNcW+5rKMJdkKMwutp20rjcC8myU3IM16AexFBsBf32NBvpR+EZef+NiaYNSpyCAu8lF5WzoBNtlxvWDoL8HddmQmVDGB9GGPpbwGueqw4b5UKrNv6V/kj0fymtpMhdgMGsfskgml3OpT2b8sjAwH7gidWANtsAe6XyuexbYslwrqcO7JWVqWhYuvNZfBJA6v5gjdAP674Uo2nPegLVYoUAISO7BRFnvPKtARtGUugj452u0SxlU+WZdc/I/KGvLZC3rb/JXJV8NgEEX6CvQQpYDrctXm7rSb0RbGlH3jAcHq6nBt3ugah0V18mmiIg3sxX4bz44vOxHenQ2W1282mjgioB1+CaMck1xagtsF2GvjFOtQuNX3+HMRevLrJMM6mBO0aPUmjy9NRTvRt7h+gYoeQJUQNmVrsDLHLQooGv7meSdr2UW7/B+ZuR7IIL4LyJQkx2Dt+SrilvSgccj0OhdoGfc0iyQda7+pZbi9U+yA75fqcF9Pb/3gb5Hkn6vZpN6GrgntdbN+sYCVwRhY9Eh3wliiY/A08BN1gGzFB0BZCLIWggO6iR19AjszL12UdKrWN93BGTQYvtC362g/nEQcN/X+J1+Oyz56zjWWKwjmy5dhADtGxZleiUK2KyFwmeBHnJM8S+gTcl6XC+K9O+xnnUvFukiY9DnMuOa1NqjD4fFLM8zmzQ1gsYuNBK4olG3QqNN/uW7G8MxCyNs2rRzQRYGvNZxBCRoxf3BtRBp/XQoXiWwhcFrWvi8vW7k1VG0WmaUWAqPgPO+vhkuwMsRnCk7ock8BGb/4oxGjioCjHZAtXNB9zqkorQlL9YiF6d/37YlDIc+k6YNLMWGkfgh6sICBwffT5vGIr+vyRy4Vht1m98w5K398JuiaCOD17zdoCT/dQatBpAdg+CVM3AGgPSMxVTsArmGvy+eeS2dum76Gn2cT8GeM9PZpHKVbEB0FgKyn6twLyBTYCW7LV8I+ieHzDsDbeszDunTTxXoJ/sNFOT5G0raeOIiSyDfjbc/JL6QF6ghkClwRaOeCM0K0qjVMI7JeDyC1zfPi1mZ1TxBQFJLpnufXuMK2DIrwwEeV7xhT48prQheH7Mnj5LyQ8AtX6OPIzNjX88Pj36S38SRMxGIPd3vDA80RQCYyaZNf4FKNzataPfktWhjQ+2KjCcNerWi5svxartea/01YTizPbGWUdQyCEsgmU2aGDnVC1IHrjIKgY2l16tqVzrm47Cuq5MbNhXE7yuwezBTS0w7UwZ4Ns41zZX8XEdgyulc6+y6j0zp55SvL4JVspmOC0VSXj+E4Ot3LijjsQ6yVtmVFGuMawcXu4Ylgtax2Hq3IJNSa5eE4eSFaTBeEwSvoQ/H4hgC6QJXrNnjKISWJ4fIhk0yk83iMQKYaV14OHcPVvLg+Id4jyhB6zRbWeu8m5vZOe0jU8rl72s8Y9DNCb5oyqKMfCTVVXYO/nVGPqW/HBhGAOES0E8dAeOL1bbmhjrYPRgvOt1U2fPbDY0yaLHnhjCcekYaBq9H0d3cTDMNcvrXpApcsWbvOY5CaDpn8/ooClL5RlMr8o6HwN4omoP74+p4tVkrHQLreY+kA87zq4ZhM7sOvgPbcy/GUz93X58PPY+Mp6tqrf3gfiECrodVpZSIObDEhGLwCdBTDph9BHS4wAE9Kiqgf7/B/7eDiHuD08LwoCvS4IrX/pw33SGfpLGhyNckDo5kJgkO5c5aqq1CHhvtr6mKIHMVBGT3OTB+XIU5mfZAQIbO2h7tcYD/lgaB3XgHNgf2yuHufHyNGbAQ+H7JEYz/BoHWDx3RpTBqANMOGCMZHCsdMOpL1TaXqyoyy4j+vcevvMECxiC4DBuAt8C/S9OA2RFF0/DaH5d2oE5jRqGvSRS47oii2Q7PJMnLt28DfRh0NAhtL5A11UKywYKQ/D8ahHszOA10FWgZyMEyAxuSrFvooGJUqQkCM/Aj6G6Kzd5G90jf+2MmTJT76AZQO8jR0op1jxuk48HSFIF9cvYBkKTHHQuSqH8EqK/fez4Xl+C8o0UG9jhoUd859HV9XBIf/SiueEfiq8xf8CN0wOU5zKKAALB9E2xl5lVSsfMs8p7gj+WpwIYomocfAGdmfvtjceDZdg3OSf/kJJD8nkl/X/osI8LwYLg0vDkMgwjfkxcMWG0PglXJL7R1xQEMEJxX7K/9ltfiHPmU33a4snJeYhyHf8uhnWpB3vs2DAk5VhZDnxNB2WIFNFbwmAZauAt/3CobZDvyUpbXsCOvni/arzQNansUXamnb2rOco/MAaW+R3BtC2g26G6QYwWJ2dGa4aZ9KfzgzwWOGZtAnT1tqHweaFQWbHD9RNCCzijajE/Hirld2OnrIIBzS+HrOPcDsHjGgcaOn8BoTBx9bdaBTsNBZ4BkbeZ3QT8BPQV6GYT4J9oNQnJe9DsQkpCiH4O+DfocSH5HEk2Y2LANOv0FKO/yrA1b68mQTDH5JXWrVDRaBJ2kzaTuv9Szt9Ex2VDTLQwq2kg/eB7IxG/5le7FOIkQb23ku7rHdYOIJIrvlA7UXJDaww+8W0GONOBNUKWcaXG6bc5s4PoAduGDoxwpnXKPyIPO/D3SPcgzZ6dTgczrz9d9aGU86GkwsxB+z/QD1wg28JU2Lh0JR4p0bJYasZW+7u11AFtYX/e2tP832H62Aw1cgr8T+mtn/wj0kIH9s0D/ByQBfdYYZyt4PAj6W5DMDDlRoMt9oLzLB/IAAynCLg1M3gonTLSNAxq1DPA7UirhpQycD9PAAXyngRyciBgQ/lbBI1bHVlIIjsh9XWtHO/Q9OgxHjEUqwMOgLjFAo4B3O2geeMuUu6Qf51gkLe6/fpyjAhQdA4F3BkFuo6VvqbdNUoFxjwyVe2Sxyj2CHRnBdylycqRhzuxwIpV4+nHlfkVOJX0IG8mEsq5nIQjZTuYL+G4GXRF2/26cX5FqXkwCjjIIP/2FBBcUoCp9bcGJf2pBxkAiLse9lutvCrqQk0F/A0VfAT0C+jzo3aCss1+jweNs0LUgjBlFGPeNPgLKyhfsMpXP4urlmThkv9h624MDrsTowSHZVc/CobI2VX7DBqHdfw60IQu3xNdikH+XE3uTdEgf7qS3Up7DPYltiXEB8F0NuhBVJbX4hhiXOFVl4MAVDxOE/PfnpzU25u4OWGcCaHmAWiuQ1wH6HASOQHdB1ojlVI48N4p2zM5JOMUOgADeaTwHa1tbB6imeLrSmcUOemMkYLV2j0BWOwJYWVtyrEqklAixlodKmplwTXUjivtSr+tJhDMqdw9e3DcEDQDfZA1NjkX2AijNe33pa2VfI3iSoOojOTZoEf0foJvz0gEYzAL9APKxwWzwD6AjFXUZBN7ngH4EWgm5V4CGKspryBqPM/kZ+/OGFeyc+DDst5YeLinC6LtcZ8e0hlIuqQZq8humNiHVUDpOvIr3+hpJ3WkmpOm5SuCOPlxlYu6ZplUNnkSb3wOSnZcPQuNfYpC1KqsBA1c49K4cHXp+GI4DrvY64/XQhvwOdNLm4dzMShhdr5L6sa0lm1lQB9SYAOwCkOMuwrvvqQYuS40ZlJAR7o8XR+MPLssxiJEJ4OV5/wAnRC5L9U0yMisPR8ywptyIIov46rWQfz3+HbE115n3/TJoIe2voIW+fsux6r6WjXoOfkue9f9kFFJmnNJtLpNBXQRMo0DyDP0t6E9AsnmbzYLXZgbyPPkt9DjXpuCaLOD+IP7/Xu17Dp8yA3aeLbkAPMe+y3YJlGT88w5b9taTsxZpyX+Q66ZUe2/DIyf1Lsj1bEp6DD7Ygz7cGbjupMo0SFIGlus3DVzzc+iGduBwEMC8zzIeTcVBn3bpKaJSDh30qUEUtS9oqiBPWkdgYxTNn2pd6gGBGKE7GO/3yy9wOaAJ/sGtIZ2O6fnNvh52udZGTT3tzP9/ean6eJldz28crQcI0KPjkO6Z98t6HLb47yTI2pj3TImSvfR1b2DVfX1Rb3nWv92I+8nqIDWCRFnDKnZLto5sWmg7YO0L8lE4IHuM/Az0tr4nLXz/K8jYZEFOIxFW2uDvsenREfktATw7DEefgbaee5wEBR5q5Ajd4xXTkRY8FANVzvThnsHNPwgdi2W6tmfj3jRw7cjFoV1XheGkmWjQKrnd2eDqvhq6SQd9pv07btxNmFnIex2ICQiLwQPrInAD3W7fmEq8IpOcuc2yNrIZOq1Grl1LPmkncmt0/HMj3QpyPPVL1bXth+9vhoyj7T8XxbKh8mxs+numbb8Cf/q6Lqg6vkaQ1Apx8pq8vMpKCF5oUzhsHgd5PwXdCTrUpuwYsj6AOs9Bx0tj1DVWBc+xDWAm6ZN5lVNh8xHawkfmkhp6oO/ysLZ9cfjLPT89l+BdsmgGy+SctbTgOHhU6mD/IEzQHb8jCK6JfY3lig1/6NvgUNw5x1nW59gwHCRBofMFDa4dIxND1gWBpOxZKpK0vVbWnLA4gMDGIPjvkqBqt0g2wjhJK8lvYnMgg5HmJmkn+Tz4ZlxQzFnXyhqYSfC7c4MVPZsD9HsFvb4R63setPK/PBvXXW5FlLoQ+ro5xGq+/gzk5ply/kXcPzub227uLDrtJ4Lbs6D/Zo6rcU6SOiu7zMprd0YY596AIfwgA9K/bnBa+7C0QWmLakX25UDAdoiagLqM3eu7vBYEj9ZVVfXgxiXVjClnJ+fE/FFYhoSPs+V/10rDwBVzFz+yp2zlh1qycF+0J9OAJKQ5HIrdVRHALDHALSaLCUiHDLBfFkuuCGC2FTtI3GRXh7V44Ek2ghtpJQPZLg++ziDAToE2i8y6hl+2KVFfloxSb8Y+WJZ3Wkxp2FSkDk/GrLvdQT1R9uDr/J91pa/jNTsVX6sGCwPY9RLO3ztAHWOnEQTKppMyCDbDGFNdRp8G+19D77friunF/e96fbP7RbUt4nfZ8trWzQ+41nfpwCthsLa11a5bN90WhhPPsCszvTT0OWRm/Nj0HHSurBu4ikPtTZ8f+KGWf7wsEzG7hAURt9lRXjrmy//RjixKaYQABisuknF/e2X9PWE41ZsHXg2XYd3r1E+qfbfzOUIGd+RGKUCRuctx2MBiKlZueFQw6y6DenioW1wrI3fkRivrw3Q8QV/Hx9WsrxEQyezjUfHlG6/5VXQSu4xz7cMQdsp6VhlwvQXk2wD4MdBZgtcz8ale4I8HIcRygHfArD+AnScf+Gbwn+pbEAxyHIiV9F3GzRuolu3zGFi9267MHddgplUGjLwquA9kQnGmS0rXDVztOdTTH+o6HhyP1+ZstfY+pCmXcta1jhMsHtpvdW3rSoxWTr7QonlGReHB9wwYWhy1q3RqZYTe8yLPx8l4r12wz1dDZK3MKqvLKfbc7idW9HVyvxn19dzk8o1d8Qo4fd8YtwaMEAhJf++fQQsaVPHh8Ego+e+w5UOWlM1z1lWlTaLvstgSdhCzzsm+C14cPLY1CE63h8NqzLSOWmhPnllJ6MO14z23mM90o/QLXO05VCZYJ2Mmwd9OWV8XYmfNK+wEr7LsY/nX+srndzsIdGJ0fpIdUZCytj0MZzg3WpnUfBm1w4KODye9Ln19o53a9GqkvlKWT+xHenA+77VLrXadCw8Lgon20mlk9/U1c+qo4fAh+jqdc4z6+v3pdDBylcy2Ip7QKwj0BoH7naA/1ZNijbN0gH4Em/5EWyL88hhkPKwtpwF/421yA97Ri+jD0trWVVvC8FAn+y7vDoL/2QBzhcOrloXhdO9mWvsCMRwbb+7F63L6Hs/je7/A1Y5Dt8PW3dIp25eH0ZoyJXjF2Pk9mjK6eVfWuvbzn75cSni9e9TaAhByn0zNM33NqI3YQm8xZt8s3BuitnRqd8w2aoBVZgcd7V16cCN8sBcANjGzmGq0x7NBPfq6UdMZ+Hh2XyMAwnYFwakDy1KpsRpcVVMWq0GrPHc/rWJBPkyHQOz3YZsNm67Nx8TgFNg3zKRsrDe5wSS/xrxkMG7QtMbnczyDdHl0nC+3o4H04Q47wY4sfSlDkT2H+OYqfUnNJfQOfOBQ3CUWHDp4emE6ZXXwnRyGF6KDrry2axQkbzinjnge0kQAPyRTre22fRDe8VWswZ3DcG+s0fRPL94b/qnXV2++rL8GI/2SPliYAnva8YN3jR2Dxp/uzxpn+jpbmzDi6/dCh+HZ9Eh99V24N1RnW6HZdaBPpNbQ3QtlFvn/Irg7S1NF+OdR8M/jeXww5L7PmG1IFccA4rnG+DVlNBjvaXVzXwbsen+UvYy5LdKHU1+73tQVhk8ivrl+bRC0G2abiF2vwHVHELwTDVu5bPxwGA6XUcZCF6THvQsdNeWyk5s0KSPclz0een8keUr6Rda1DpW1oYUrndZm34x0ai3jvyLAeuaFloVaEYcfvIV2Bi1kUK/zeCtGZRJCX2eCr3KxEV+/P7seqTmorslGUCeblf11au3cv1BmXn8IO2cpq/ptZf6N2Btrm3j2niJ3i36R1NghD+vLSScBc6CXprsy6VXShzu8kH245dizJM902V6BK9Yh/W1S1ySrL46cuDjZNZ7Wxq6aT2M7UF3tp7VG0VI7zyJdQ7zhvi0IvqKvrKTZzPhjfTn5SJiJ2Tc7KcNGOrWWQZphMaXWsmkQN8baJl3r/8y+dUkl0tdJEatfP7OvjQUH9fVreHQpZvP+q+HZjCcQzJ0MFrdmZOPD5TLfgu1ZIs15lzsgA2Ou1ouxtrk3CP5GX3sJZ1acpi8nvQSMdHw2/dVxr6z04dTXYMfVxnS9OWG4fWsQXGaab1x+bwWuSBMeGgQXxL0weT3ZnmOGxc1Zkmto+opzw3DzRtUNaQZD5bd/0LTe5NcAAaTaTLSSJrzzkqKlCPdFFBkJF8mjXb+s9Gi2QQb2wnZ9TPKTMBKbdOkvoxD79lkaVU+LJX2dFrn+16X3NYIdSRF+T3+eVo6ozbbCLsmG/DeQnQQhK3A1FXIUzsrMq6QPGy94LqMrF/yrccYDMzwZNo0YuNoANdC/xzDuuQPUMnD69RvCcA4mNR0tuN8PtbI51bqr0Ifb4ygKRtSaEIY3rzHCKTmTA4FrB3Yz0c37HnosHBklV9HvK/CO18XIB1+iZ0XHl/R4k3NPBJBK/w796e01SBWdcEdPuYX8Hxv24LVbV+nbdrDiYJxJ7WWkesb5Jjm6ygvDbWfr6zZNdhfOa93iAObR1wMAlPB0Jl+fAmEYs7deZPbuPkWp3wTvqYr8XWQta12vVFRMbaChic6YIMy+cVgbflw0p6O79Zd49QgLv+lN0BrgFAKtE2S6R7fIJF3rIl0ZbnDH4vxcdhk+ELhiPeaFelDI6PLIF/X4u80Zvx5/qDe7NOY4fzYicdtPA2mHx/LFA9XJfn6YhU59di1NcGgNgkXyiNctsruwD+n0m67BwB7GD4tfpoThhnbVwTzBsNI9OcFNNOlrs37J5OvZZnWJze1JzOJhLNR8wQydZGF90jxnLzheA/vfqaTpY+C7U4l3M7aZ22hoZXOuzsvwG+b0RkTA4aPNgDZzbuslZZmkOxy7DOexUdOBwBUOW2DGaX25yCjMjI/0PVqq75hdQgddKe9f5gB3vL1UeOZkLOZJlNdGyGYtEx7OyTz7YrEOHGuGLayTeFteqYAxMZVhrclfjVm5ENWQv2hh/c9uC52UpO6gr5MiFq9+al8fHY+/8Voqz/lqWum3jGvrD0OZPb8TOBifWMNAg6R+/jIHKEy0UaX+fQ0NGYKecEvtm6ufu9T7cJgCDGbe6ar9GnohJeADGnyb8ey+uXGTj8PcdrOK6c91tQdB9H7MCh6cnkchrsQ9o1W2y0zgFVrcyRcIWFkbMaJUa8ClXbUGwS0IXm/STcHe/QmIUukoig3ZyzaZbcW4SHmKzLq+FkXLjlBdM97ycSDq2HORvtZp5al9bSIoSGOS1vPoy1BmRhqFCnSNZFp8CSRYmC4/A8NzTDMdgF+2Noq9OfT69zXNt8tvmNOzrejDtUxQX986SGadoxoqZfjEcshX2qOoHQ+dVlv2VgLXtiCYrtdxHCPGPGTLoHLK2SczgY510IrliZVBcIzxIdxeEElmwsSf9DpUhi9h2LUxim7D8+dSPXM7zwPvz+nxz8JZ4tX912Xh4Ou1GMn8PHR/XE//0a0YMG1xp0NFXzvo62xBQTqDtuCyZ9Jd2vgqzDLKMkbJ7FrWuFZpzmCyJPoqZklNB1MSuNoumdro2iAYr9e/r0FxuKypdrpgHc4U3dkzeb533uE0CErKIc3hM2Ct+FveW/FKXzwMgg/1PsxvfiEw5hBZ51q2WRubPsKv31m68jZjHbjjI5ZKAOD583WwVgxcJ8j94VAA0xPIN/DOu8NKsba1p9XyP9b+P4nZ9kCvUyXdlAiZTJUUPxGZc6GvXfI1ApvRaBBTcmgUv0RAhX1NzBbwlHzNk81yJbeeCADjV9FuMNcTzOx5XPn/yZA5BrK3ppGDB+Bxaa6Lf82qLfgNk7bndNmIe/0wVQ1Xt4dha1l/y5/YBGxl5MxGaREh6Dh+0IYwytBCQLoDHZO1uJMv5sSC4FO6OAz5hi5/d7mjB7BCVobolcr9kUcHNYZJB/1djErFrILZkA2qs0OVN4E45Hf6Wq8hp/L1LD19mnLmjGhTeJw/+WwOGqaedd0RBMrtvMv52VbxFyYftAd1rs+hXbghEvuVIGfwAVvKVAJX/NEdiLBlTanlDHl7qc1XNn5QEIzREyEbtkx9Wo+/45zx0AMCyg+9gzHw7FqR1KK9v3BNK5v64LfnRl15O/Um+RIpTl876Ou3JXKhucovmWNFTjkg8LscZKZuqxh0V8xmEiSG350DHolFIv9mUuKLEl0w4weJqhesMjpY1iZfWrBgORyhnkpQMA85ac7qdzmpVhGUwj2iu7nBWqTaFPtl1QM1g+FBcNtAdbKdXyEbNDlWZBfpqaVMLao5AvNkyuu6N/63mqx8P+lrB32dehYrY1v6fcbreXm+COQRuKZuq0NVsarszfGqqghDzKHpxYZY1WEjmdIhspHLW7D052kZnrVRZMY11N10xoYZlIG1XOcSBR0EMBV4iO60zSAvUm100O3mOjEIHpR553KVFuVg3X00ZXfhFbpq7tRlH5c7fe2grw+P6z2D9SLwesUgP7Kyj0AegWu6toqddJEqdpweRJuwrtOPvTmwJHKrHg477wEOcm+Xt+B1UW8EgWw8p15asMr8cN1OuboNFFBBYH+6BxvRGxCBd6imCYv4KcppsgOa6EKFTsX3RcG+fQtcMLK3DqNu6P29nN+QyrZMz/JBc/R4J+FMXwtajvk6j67PCmyyo/uoS9IsWTcNAi93N+U0l6a+Jm1bjXRnwcI7U1tk80JkzY1UDeD3L7VpjquyMLt/rQ3dWrCjz14bgiiDCPiKgP49srrUKSaVdoF1rpgaUwxghimOtqZt2RM6017J6+IisOd9cWvq1qOvdfEV7ol9nTYYyGLKyiwX89r8EcDAwx5ogcklqyWPthrDQPnZ9qKEWOPKoowARuSstAdJFWYpBAKTKu8sLIQppTOitXQW1zNYN4rbo7i5Vj1rYh1zMJiOpbfRStj4rAwp0/Q1Wo1jvs4jGJBFgSz+IyBv8rJZ8mirNu3TlqU88xz9VNsAH/ijkVqZhGHg6kNroI4FRkASeZ54s8AGxjZNdxOJ2GpYqljZzMHKehBLBlFMQwTo64bQ5Hsij2CAgWu+Pjcl3YvAFTv/TR1ryuK6fKY+Wvdw6Q62ls7iegYjh/6JesdNH2tZFwQOvibCtJnkRwTSI4DcB2y8rVWkHzNnhxZ3n/gi/yqPTS9ygqiyJR72i2ApPgL0taM+ZuDqqGM8UMuLwFUfRy5z0sfYHwnHW1K1pRWCdBdvW7Kk9GJ2LfNldzffXDUBeft690hlPJTLL9AokEb4oG9tg/oSASLgLQIMXL11Xe6KM3CtuKA1d0dQAXcQQJ7wFBvatEDQUL4OxwbU2jIOPi6KgkKlfiOQcWJdYjuyEvTuEUkjDLjLJEBA4/24gMFCBIgAEbCAQB6BK7NrLDjWgggrm9D0sGNkj//5LxFwEgFM8qy1oVgLciBt34A27CqhjMrSmeK8RwrvHxsXBK0uOFJ3V2GZcY1wv7MgcD3MMRQUU8Qds5Tq0NclagNRFEmWC8ZGrZeDrEukQA0EdJeO9te4BW2Wz6j+uPCIQwg8b0mXQs3QWcLMUTGdSwr2AmTlXeCcciN/kOAO3V2Fk/sbowk/S35V3CsqWwtwfwHA5cJUAn0dt91mq+eCr6sW5LUXnEMQZPNlya+2khLZB+OuPt/5NQECellzCZQoeNWjguAEPRNlci5cKfwZuOqhbJnz6JssC6Q4Ywjs4ruUjWFpjhEejpvMcevLSSZeojw6P30Vyf078uQv1VNiUOWHbiD+9PVACJk574KvzViSmkse6cmpleWF/RHAzKcMPszuf0b1yH68P5ZLijJArLdPiSj15ocyqFaYS5G+ayVrjrsKF6LJyEjE+H8thClVI9YEwcGu/MLr77y9U3GUypNWEUUhcq+Oc0lbfb+7ZG1+uujOtIf3xrGMvo6DUvY6Lvg6uxWZOLjys5bJiJJf/AHYP8wyBpW1YJZlFkdcGEbYTWSZnkE79FiTcz8EWv4zCLb2O8oDniGw6SqkCesOKFlG5JAgGKub2jFyQ1yT8Au1fnfcyqnqdbw71WXFuijU9XdysPSfjes/kVyr4l2BuWfNAYtYafj0tZ125YKv7VjaUApThRtC482Jz+egKQPXjKBjA5gxGVk0uTz8YJOTpTmFTQMUs6e2B7U3p7ScGwRbeEf43K7WwJmt1/tsQT3d8eLss+sdN3ds+ENxeU3Frr+6OTrR1XF1KWo95HOe4NpUhP6zcdeCovozrl1PRtE03F+KZUKsdcr0taILqqxd8bW+pU0lYM9BFl8RQJrwOdD9zBz0Zzc9I+joX9yZkUWTy0edi7d6lPu97NhQFSMDioPQu9prDmhB1BMhSNhSO8BPnxCQSdaphfwhRIN0J5jDPbJTNc1kWhBFS12L26zeCGjJn7QqMI4w9WfjuNaivcIqDqw968xSH6AaEa/DR1/3dIvK/874WsW62EyxfwmLjwggaJ0Evb+Vk+7xnmM5KeeDWEw+rNfTUzaZ7tAdg9VT3gjntiA4XLkT+1RNUexJEQTYGWZF7QA/fUFAklcHT8KC/c2+aBxbT4zc4BeiNXb9xBXlN2D42iSXIbBSTKmXJNmjz0yiT9HqDgmCz7poEwYsFJ+N8pjfcKSLdtvSCTfVF/RkyX0erorLn76Oi1S6ei75Op0FRq4ahQCIm7IZgdIeE/hM1rTKPiJWNp+pYxkXUdYBJckhrBl5OEn95HU7PpL8muJcMTwIPqFrzeDnavwrgevQIPhR7QA/fUBg8zLsXTQIQesGH7RNquPvg+AduiM3mw7kysfVDTkgsTZ5icuvf71tX+l/rBxHlkbRqOlBcIiL1mJIQfnZuF1xTYiLiPbQKYoGY4haM7VIhO3vIbHpv/R1U3iynXTM19mMyXz10Zk5kIE1BBC0ToQwCXpOtSa0vyDOuPbHJNERTD4oT/LsuDKRQgWr3BkEX9I1acSPa/wrgSv+/KZ2gJ8uI9DZDu2ODcNxx9cWKbusbVrdELQqb36wH4F/sqI/Wjf1OKSNyqhu6cq0IPi4q0ZjJlh5lHbE5a7arq3XRqwVk5cC6ZUdy5K825q+1vOEa77WszQWZwausWDKvxKCVtl051egOTlrsy1n+d6LR5rDRt3IdRqW/pRzydcDUTR2uurkA4Ydgr0HsqcwyBwEePn6UuVWeQn4YyktS0IEMPteKa/i77NhOKz4GOK1KDBaeRZq0PequMb+wJDrCtmgSa+jLZw3Il12ws2xlSpIRTyE/rerpmBG8FkspQgqD0oVJSdhffOaOWE4VfsZrKJ9FqbIffv2+CwMBrw22X1OXw8IaOoKrvk6tSFmLmTgagZHFS4IVtEHD/4QJP2QU1SEJGeKJYQsmRCQvUqiaNlYtSwf6SUcJgPRCzPp6eHFxwTB/9RVe7VsQnsg/qn0x5AGuWUdpE5Sk7zzN2E48kU19mRcGASQ+3wuHizKJd5Oo72UCMM9a6Noy0zVUaWWmzDrekuRZ9N7YYovG6JoFgbOnEwTrugahh1vwO+6o4md34UsNK3ylLYoap2huo5dsJzxg0SI0teJ4Ipb2Ulfx1Vep957dNgGGASLbgPvt2vxLzBfJFwEI0HyW4QkIOfKy85p5KFCBweB3B836ak+9mr04b5cpj4cHjqDMZutnDk2WPx2oFQC18rOwlG0BEdPP3DG6D+dL8jumUnStoyKJzNvEOgMgvt1lZVNrUZiGW2q8h1cpXiDSsjeDv7Fe71RI7R3BsHPEbg6XfCQVPb7DKQY7ZhdpsE9YKq9dhhtavTKpA2Lvk6K2MD1XfX1wJqr1TgZAeZI7FGBiWjj5V/A8ZcgzEewFAgBBq4GnIlsvh+DjWLgKruzlKsPtyII/pdeJmLN6ZO+XftPPitrXOWf0arOlA758ltEDgsRaITA8ig6b2qjk8aOr2vHAIokzCcueCT1GvVJzCDWBZOvK8ta1x1RNFt/1i0W6E0rwe93Nq1g5ORmGTgsRZFZdsxgK27KJDBukPWtXUkBpa+TIta8vsu+bq656lnE8jqTBAiG5Tnyf1W1J/M8EHglD6FFk4nAdY3uOldBbJz04eQeL37BbtvI1L1a11CZbBraK2P3QOD6VBA8pCt85qUYZWzVlUHu3iKAta3I0bnXgv6p15Bineur29UVlLGr129XF+OAAGzY8oIDagyoAvLH/lPf79MPiaKNcwdUpgAVgOWv9M1ouTGNDPo6DWqNr3HZ1421tnJG1lBqlavAuJBvHNACzHG+q5Vm5x03W0E9rHPdGgTKg8Qy67pccVZXAZeULF8Pgtv1Z1srk017eqp4IHA9F+8DxZSvclnfhpEIprAoo+wje7S9q2VeXr/MuCO1jDDselP9oSfaTb+g6IM8b2J2HbOtfhRrfm95SJZU+AFKOi0xAzdvppU1za2SEpa80NfJMWtwhfO+bqC3pcPv15KDIGcTeP+VFn/ytY4A04QNQo50u0UG2TVgVZmos9OlbaCB9uGOKJqGzKkLtOVg5f41fWX06iQhr+qGvhXMfpftn15PvKOrWR3IzTUE5D2eh6unG4jVa7CcO9u7bzGW9hU7+K1psyMnBylYzI+UHRuz68aMw3uKlHfNE1Xld27Vt4wp7Roj+B04Kq9hF6NXbcF9njojjL420HA88bUBS9OywOvPoilpLx7oOrR/6WcpZ9ENpAXPG0LgJUN8yAYIHBUED6ZaK5YYvRXPJr7EowswifNbfXXFU6t/2FdOr8AVU6H/1LeC+e8ym7Rhnnm+5OgrAhi1sZQyuueGrBhhI6FfSsa9fpmKzdrWWhgZ1Lekr4Q3guDf9NNL+krN9h1rr5/UTxcWHadhScWGWdm0dfNqZFX82ygrqu2/NosY+joLet3X+uLr7Jam5oDuVvDp1FfHu/AiVFsdryprOYwAZ1xNOgdviEAfZJlJlvV5yaaLb55X/5zfR9uj6Er022UHbuWyGnvSzOnX9eoVuM4Mw/Y1ymp0s59wP0YbsWSQpewIIHd8PlJGW+3gcGj294WG4b71QfCAJX0vj6LOE+3IsiNlYxTNnYxXHtmRZlAKUkjh93sMcmzCatDLRUsZ3gu/I6vCgt9lhHZVto0A6esmbXPgU175emBzNGvM12SOWVf0z4OPg/ZoyiFvdQQsDeyr2+GMgEFB8Hk7yoy+F7FOoVKG0WeXV9ldZwe/kX9WT06vwFUq7A0CWdhvoWxfj84ZsrJYyooA3os6sRWLu+3YL+mDw42MPiPN9XI7OouU8OmiPPgewAN8jMfpayOC4C/t+F1+59YVJs1I7nNssWgpbXEldhPuP0Kb1G/0dVLEuuv76Ot0lhq56hg8208ywqkBEwSvshHaZQ1O87D7CEiC11Puq+mXhsiqeSL1WpJEpsrmwms2FWZvHywBGR8ElpaxYaogmPCLenD3C1xbg+AfZcxav0jS2OrdRZtZ0MetIBJwA6BzKC3TUjlI0qaMlIlh+MprRjjFYSIPvu148K1BvOxxgb9PCYJNYo2vZQrWR6+1sjmXIDQJa+DW3e0rVgf0xnb5du/zIz56QHaGf+jrFOB56usUlpq8ZL5JZvV4IXiV91AXd+18PaOLc+wJ+I8z5qb9id2Fu6wN6CBMDtY9Z9oE6/zw5g/M/Oy1s9xHrBt0CV5pF9Wzs1/git1r9mB9iqWUOHHoG9hglDsN13NOYY9FUYvdG0Di44lG03uR3H+2Pf/Io2LkTm9nXqv+LkK+DPx+oT2/T8J+AFu9DV7XRNFwbG+6294P3QqshwnbTfmHvo6PpO++jm+p8Zqyg7yNJf+SLfKIce3JUBuBR7UFlJX/hCC4rd/iSTUwKgPRz6ux12aMPtybmHiQiM1OkfnwCXc1ktU/cEVNbGFmMbVkMvoHq7s489rIRQU7jlH5dUGw394NIPh1NBy5SYvuhDB8GAM8Fot0//dh5jVqtSg0s6hqh9ayvzOr3ZDB8DBcvdzKxg41FUajY7vOux88GWTBQMVOu4MVEz5cQ83EJ30dD8Ui+DqepSq15Bb5MxXOPZhiQAerwCprzP+9x2H+6z4CHGzQ8hH2K9kVBNdose/PV4JX/14JWuvDjbOyGVMNta7LMNvaVfvW97Nu4CrvdG23lhInKkkYs2m/9+mQYgpLQwSkg7MNMzDyUiR7RWZbZ96pIW+k1VlXsaCSaNsGHOdp2GOaJ/ScaD94MW1Ff34YeDmn/1HNI/KD9+ZmDO55kWkNv88CGptsTCO9hXob1rCPfPGt72b+o6+b41gkXze3VPXsVcBxqKoEMEfwin568BHQ/9OWRf5GEJAJwaeNcCKTughMDoKv2nlLRE28bOuyDhN1fiz9wnNpGnbRtTwAXZlt/VYNsXqfdQNXqYhOx5/Uu0DvmAw8TpR0yFY9GeScFwLwzDf9CgAAHYZJREFU62zI3iTzhnbL4PMb5cln1cP+rOsBjWVX7kUHvjn4D/SbC7XW2w1e7ABxCmZd260O7Ild45CZsgsbtrr9fIR+86FsDq9vmHS6oGS60NeNES2arxtbqn4Gb5YILlGXAgHVmddP4l+VwVwbNpRIxuPwl50tZ0oEai9Tu98SYXHWVaTL1E0l1pEBXmcLnu8yQbLK/mj51ksG6rM3DFxlc4qV1l77UfPdgRmlBbUj/PQfAUylXwkrctjSfQ1+qMffp4kgbiDVXSGb6I5X5cgsXGR/LKCJUnJqexTdig9Lu8gOoIzSaazRPleJdRO2lWGANvjcvecj1sBsi6LHoLylXcJ7wiRrW83PttYk0Nc1JKqfBfZ1H0ttfv0i7msrfUQEQ/thmATKXwc1TMezaTxl1UXgkbpHedAoAjOC4Mv21rrWVK/c6njt3X7pG7tVsAkTZhAXQ6n77SsmffaZdwwkt2HgKhe+bnUjkl6q3hRFO6WDZneJVC8V+CUrAvDf8C1R1IZGdl1WXumun6geVB4ehs9gh+H2dPplvUpm4QLEC5VZrqzMMl8PPabJIlykUF+amZnjDOaE4fb1VtfH9AKk9nx0YtACLj8ROYj7oYzKrGcvy+t+mTSn7mFDB+nrt4Asuq/fstT6f62QeJEtqQheI9CXIO8M0HJbciknEQIPJqrNyukQwHu737SU8dBfwZbrqhMQTsQ6eL7Pxm951/BcBuYFnf2x+uxNA1f5wX4jCG7oD7aNI8NbIQX94M5bAaaVkchmVkGHsaArQW2gnkVmve4GzW52fdnOAQ+ZFdo5Jgha87F9Fd7nOPQZG7JHBMHJNuQ0kXE7dp+VdtjapI7aKcgdhln1uyFglRNPXzVLezPG+phrELzmVCrPRxm0WJjXxnaQPRaz67Jx1NP5pYS/do+p9zM3cyR9XR5fN2sHyue+hntqtLKMXuwRvC7FgeNA3+51gl/yRuBF+Mb4mv28jXJV/swwvGNFbspVJiBkzH8RKJdYB3JH7erOmHohv9/y9iVheHisPnvTwFX8OCUIrrI/jd6zBQ2R2RtZ2yVB44D69rzSxP+QOXZPd+cMb3aozBy29uErs14XgF6IIulHljuAhf1zcQNEwOOmPjhZ/CrLQlacZkugpNXnN8BTs3K0tMO2KNrzPOBvrR3V/IScUaBFkLEbN6bcA+UqmLXAoMWxORt9dRBEGDeoPB+t/OhB1kSQpBJtwuy6dHpzKvLLdOSnrQinr8vjaysNqq6QQ3H0K3XPKB5EgLQDJP2sD4KWKYpKwhoZ+pV3z8os9Jmgd4Nk35VrQE+Bil7uKrqBrtmHTuvMnHW6HPIl1sFgdIRJT/0COTIhJ5MO2xCwnq4vsZEE2SJr5h81Opvq+EYEIzDOlSKjEshKUyzI8YaM2aDF6YzeLmv8SlOA0XDQlXLHuVE2ymyv3YI2s84N46ta7JQZ2Hkgo4M9wg90IrbFkwDZo/Jqm1aDWIU1vQ4BIdkfraZtBU/x+1wM4rXh05GyVzVFuB6G9HVerjfra1gxJi9LBpC7D+ePr9f2bByDbOn7fAyU1/P9Zcj+Y9CgZvbi/CyQPHfxU1S4Im3AyBsDO7B8Rxmd1mZ+8u3ccqd+y/c9Bt+Zz+Tsvscd68NtnKvSVl7L70HW4L7b04YTElAPM2UweMnDUDp+Bop/72tKgiMAktm289zqyIrb1qgFKAPhs6N7sEOUcK3IA1DulVSjeLhOfC3XCx9Pi17gKu1itXOoVIaRpGMnA3CpZmJxnfh9HshBv6+QGd9cCn2NFmG1mPc11Hc1cBVknwSFuTTuqlCRD5IAcilIOziUjJGHQPNBQ5PYjfqngF4FFan8PAkGzeoycG2GTv1z7j3fK01b4pITQaniHVwnk0tzQCkn43ClWkn+fI//cETnB+/g3Ks71Vm/IcU42o46N4N+DFqBtJc9+BywwA/SkT8G9NcghVRHebfgEd4t+wMuPTu68kOCjMhA0pgkXefjSMQ9t2cFHHOkSLrB5hFhOLUjL4VWYcRumtObE0ka9eAl+PMA6CVQO0iKPBBxi1f2aj8Sn+8EzQXlmAoK6cbKa9h59ki1VCDcM3Kfy3ICV8sWKLYUJL5/DoRXlAbynOwEyT0ua+uOAMl6bcf9vh4qTm4ZaMt8VFIp9LUKrA2Y6vgaPhwDgXJPuFr+HP2YW1xQDljJc/NCkKTlv82QTsjMrKT83ovPH8DWtWn5Qj/pm8gu9vKbVYTyaeDxPROGSOB6MPaeMMGrAY+Z0LW9wTkvD6/FUhg0KHnwOFoO9OEehYK/Acm9I323nr/lU/Bd+utnofbpg/GPm2UN1JqW+Lc8fuAK9p2I+If480Lkdqj8W5Agsx0kReJuScGQB1wryEJpuwHB6xUWBGUSgYf/HDD4GijHPPdMJuDivSfZ2pCpmabtAHNGswo8lwMCuoGrGIQ5zrn4gSj0a4BycFwdkbum29iQqY7gA4fo6wNQKP+j42s8ol0PXLG5Z3AyggLpwzhTgJsMZMr+Ee8FvQd0JChuWY6KT1bpAdiGF1eYKdBrAjhJJ/5wMxxz4yJ91UOBjZHBdwau6fz4JrIJxwWBDKqwqCFQCcDHoa1vTioiUeAqzDEasQijEZcnFVTu+k+MDsM5teDZKSjwwD9xd667gpqCY/01YTh5oSlumfhgJh+9jp357c6WSfuCXqwfuApwfD5qN59N52u/mzmuBfR1XKTS1tPztQeBq4D2OxAGY80EMWm90Ow64Dge548CoZ9fIfkuEwTS35EZbemUyucrsAN7GOoV6PI+cJeMEncnmAY2/w7gdMnA1eLVYOAaD6d6tVYgrRajIOfWO8djJhDYd1oYDlmahlPiwFWEYAHz5plBcEgageW8ZiVGF2fMc8127P57N4IrhRRp25bKq28OO9621Gby8CPaivO5rbdtpls5z9kJXAXb17EfwPTCpFi71Fo23Yag9XMuaURfa3lD19eeBK4C7u0IZP5UC+Wi8YVf/zds+oLHduEtlOETpvRn4JoNyTcQ6+BVaIx1ssFY5+r1V2Gi6fo6J2IdShW4Bm6vd41luN1KMiX+K3dmXbHxAoY+NxXjhlwRhGFrunas3AiQTjgHQ7+PK4sh+1gI2AtcRR3+4MVySoJKK7BGuXVmggusVaWvTUOt72uPAlcB9zMIZv7FNMpF5Ae/ToJdkpIs+3L4Vh6Hn083qTQD14xoYjMkLB7dLSkELKYQWIV3rx8ma+ZTl5ZUV4bhPjhSHhAssRCQzJVpkkLjRMFTvSBBq2QhtWLZtZtlCF7ujtXy57upHbXSRADLKcY7vLuDpukKvFeAZ6tsHOVkoa9NusVtX5u0NAGvbyMgOzVB/dJWReAnj13ZpNPH8lUflS60ztjoFbHOOJl6YjGBwNolWYNW0SJd4IoL8YDYsBfrL0yYUg4eo850wU68a3Qhpi0KkPogS2h2YwfhwOlnyrAwvA+7LFzmgu+pg0UEwrALGQ1DGLxmxVwQbMUYUCC7kLpZ6GtDfvHA14YsTchGtkuQ11gck/C6slZ/wEPDn0af+kEP9S68yvDLZkw9YfUPSzYEJGidekY2Ht1Xpw5c5fKhYfgMooazTShSfB47JuZtI374xmKa/Oq89cguX4LWHbm+9iaJDVD05p1BcFWSa1i3AAggMwXB6yDZ1pwlDQISyEyWoNXpwamKZfR1Ggf3uMYjX/fQ2uK/8rqtn+E3nB3ogUF/fuAqztX4mnMaUaEDCCB4XY0vTi5VOaCk0/+swz4/ZoJWMTNT4CoM0Kt4GC8D/LD8z+I2AquC4FG3NYyjnXRwRqPZ5feu1jha9q0zMgyv58xrX1RK8B2zcdPwnMWL1tpLYK1BE9dtQdA6yIugtWY1fV1DIuGnh75OaKGh6oeBjwSv3r0b3pD9cdmo7l4cV4kE9V5E3fsT1GfVHBBA8NoOsZPcH0XNAZymIrfilaCHGt2cNnPgKvoeFIaL4Ux5txeLqwjgFS1Yi3Wcq+rF02ttOzqz8rJiL58dMvPKNa/xPF2oWmEYTQ3DmeuCwMcUthxcsR67hB86Fvd5Vw7Cs4mkrxPi57GvE1pqqPo7wOdhBK9InmJpgMD+BsddPXwtgiJ3l0K4iloOesFPGzZg4y/ZXYUlDgK7LwnDQ66IUzNJHSOBqwjEFNhSfBydRHi56k57Kk97ka54AvL0PS7rsRPZ1JnozHr9gJc1rxzk8bgZZlAdb5WXUUeud26K4Q688mby8U2reHCSvo7jpGL4Oo6lhuucAH5LEbzOMMy3KOwmeGTIK9D1Po/0Lb2qGITuwEuLByGAbS89GM0BODYMD76jeZV0Z40FriIeoxFyE47bnU6Xgl+1Cpm6+RVspDU3P+mZJZ+PzuyFmbk4wqA6yDOJ94kjDrGoBp6RN0McN7Wrjznu81Gfq3/Kv6P0dVOfFcrXTS3VOXkU2D6B4FVmYFl6I/C23l+d/nY5nhP+ZZY4DakF5eCzSciiwqty7rEgzTMRlflovP4zlBR4lWI0cBUNoezmgzEBi7Q4rFFi6UZA1mXOlH3+cyuYprw4N+GpBVdCu+loU4UbkYRNG+Q+4ahd6sbh7YXw/TNrkW60ic/Iqg8r9/nMgt7n9HWvO7W4vu5lpp0vWD4fLEHweoodcd5IeY8nmv4YzzzV5SPohw/xBAsv1RwThjKhwj1+DnivA5swjUOzDmUHVbViPHCtaIodFpEqNZajETW/7bos7xRXBEky0+NR2b4kCA7G5iyV3dw80juBqrhPZNQOw61XJbiKVQuAgKQbjcczEhvb3VAAczKYsHlZ9T5vz8DE6Uvp65p7iu/rmqUWP5G1GPwSwetfWpTprCjgIH3aTzqr4FuKdeBfdZ9hG9xVlaGit+TyP8MIoI+6GCwncd1r8OEwHGF0E6ZGrtIJXKvSOBohQEhzbv1WFZLcPvCU/EFuwpMLxg0w+gwvN2dJbmuA6Px6XMYHXwrs4l8Sbo1f115NbGwnGxccXdLOBdJFxx1flvucvi6Pr+09QSqSZFbtRgRtPwSNsSzbNXEy+zXLNaXq6PNVBDz6WXgYHN+om9mDN/2xwJcbZJ5xRxDcVj40trbDZuw9WgngrZivGriKBVVjRpc3Le4gpLrmv6HQTGzl7f77JHdjllU2qbZ3A1i5y2IIgc2VBx+qlm32FfaGLfj1OzYGTBmqtNyY4WLVS+H7V5ARIc/iksy+7sAsa+WHrnBLAAZqKPT1QAjxfAYEPoZrf4Pg9V0ZeHh7KeyWzapu9sCAl6CjtWc9NuX8jg4m66V/j9VOLDUERoWh7NEwUzVPtibMjU8MPh8yE+2gw6Y66oGrGAOjtktaHP69zKZx+cradw3sRhkuLy52ogxzFv/KbS47kGGWNUT2ZHkL7JfZ19EYuZPOfZGLjExin6rwehnYQQtQfvfe6h86DSZehwAsZPZ1En4B2p3WNbVylXnl07ABE2ZZ7f7QpVZZ40L6WgNV8uxG4A/w8R8I4r4MOqgsoMDWj8LWX4CmeGAzlo6Fnbb0xFP3n3Rkbb9Hh6/fXOHbdtmZCFYUON7pEt9L/y2XwWcB12rBA2YUOuWPj/T+naKNYJMgbNRMabyNauR2PIpCLNbvmpSbAn0Fy+tYB2PEJp/G31cb177jXpmFIOZXw4PgENd0S6/Pvgfg8wvh836Dku0wWOf9DiuxYcAMK2sv0uPS+0pAcSIAenpU78M+f7sEPr/DZwO0dKevtZBtzBeYS0pt0TeQfA02LsB992BjJPw+Az8iWaUye/nnnlhyN/zxKdu6vhpFbRjRaDUsF1t0cMa1GaZon5jwDm4CXdqsnj/nOjGhMvTsvP1uZca1p1Ng8HZMpx+PY8f267n2rOjn/1dhbSZMdDBoFTwx0o9pbwdexVGZeUHAKgM2DFobNXVg8woWDkimwkkIYD3vZO2XNHAsAxkyD3bVvfURpJ3fCIv0x2VwZIgC3/QaxbkSGD1THbU9zV/fC/bBJZIKDnvuiGN3GevQ12X0uhWbZfb15+g8fx/kw0xkIlBg0ym44GmQL0HrKuj6PxIZaajyiCA42RCrKpu22/Dc2mCWZ/G4AaN9oM/BMrjA5/WvErAGWPY4TLKl6Hc8fOZswx+/y97F0B8TY36UdVF0dz54dz0PubP9QMk9LQW7rigSDH0qi6Bs7IlDzLq2mTVu71z3PJlcI2DSui+KHjOLjRa3PW3gPCe5lbxCEAB29LVyUwDGY0BlKjth7A2gQ5WhVWcPGw4D5dSHgeR0ZS8uO1UdnCYCVkTRwnSq971qNd6uyJIGASA5GDTfo5jnVugrkycs9RAAOLP2+Ncpl4enl05dbzxAABJ1yy45eiUodvBSr33w2FsICJaCaQVZ/ONgkQDrxCgKki9FQDr7G1G02YxNu+a/hVox/gMuw0AL3PO99MsqHSMvn4cutg76Ws8rwLZsgavcn1Lk0fFN0FQ9dHU4Q+dpoG+AOkC+lat0UEnGdU3mwU9pPkvZl0sGe93aAFLaswSGjpXKwPM8KGU9I7cuUD4cBFjSKV9Y6QY55s5udTqlUz0fJLnrXhfMvCrN3lW61TK6Jy9IZ1FEABhPBF3ZaSzYA7d0RYLVOSAjDzuMSGaYXaw8PQo/sw+sxfdynxkK9MEpWRG5vM8V7+8aa+BMX9fAMPAJPMsauNbu8N34RzrNhlNIDTinDwvoiEHQ6Hsg/Mx5WX4CrZMP4vbBwdTXralnq9Fj9Ciz0BRe6nzQNoDrbNCt+cU9lWD1PPrXgLcBYmu+zoT0qNKUJBVYRiC8SQeOCz9sWgDKWHphxNG4uOAbrgcnShqKPAAlmGgDKZaKzyXjQOQZCVb7wgG+KZYRVNL2vR9U6ovFQN+B1XDQXJD4RCuQFb7S2ZUBisI9CwfC2JXzgj2Ivs7gEOBX9sAVEBwov8d/XwQ5M9AMXY4HfQUkuvlcXofy4zM0VZVLoZP0Z5OURSqKkGk/BOCUsSAJIhcrBrJt4C/LuKT/5l1/yZlRoH7e63MA4EoK2tmgy0Cn9zlt8usyMPsRCLufBr/DQmTsjVLsAmyHwcKvYSuVywdowbJB0ArQr0BPgZ6U78Co1K+wAQZOFvhV7m/ZdXE66GjQu0GzQMeAZFfNQ6qEj15F/Cy0FfQ66Deg34F+D1oF2gqfd+HTSoEd0qG6ECT3/TtBffWWe/Z7oFugV92Nn3CuVAWYya08GfR20LuqFNfvK1H/JZDg+muQ7E5q1eeQxxITAfo6JlA9qgGzMuwq3MPiWP/KM11eKfNz0GOg5/A83Y9P1QJf4CUTwQmgE0GyeeT7QDobzIOxxSK7050JDJ+wKDO+KAw4Y7Hqf8dWmTfVf2+SqD/4Bvz5e9hQ+H5wfODs1mzyfJ8BDx3SoM9e68PV+y3fAn96vU7Zm8C1b1OBMyXYkofb8SDpkEmn/DBQ7YGHzm3lxhMHSql9iiPl3aprQL8FvQp6GbQNzix9AFbFdSjwkB+sGnUBG2uBCuSyEAEiQASIABFQQQC/cwxcB0Z2G6osBUkQ+yyoDbQSfYG9+ExcqphPxIWyQZT022qB6tvwv0rWDvjmWa4AVhL4OV/gG4l/ZJB7J0h2wN0F3aUDzUIEnEPA28DVOSSpEBEgAkSACBABIuA8AgxcU7tIBrBXgdpBK0CYsKvMEMggtwQ6QkNAEqD2JRkQL0v5JgK/L5TFWNpJBGwiwMDVJtqURQSIABEgAkSACOSKAAPXXOEvuvB7YOCnELh6nY5ZdCfRPn8RKGJ6hr/eoOZEgAgQASJABIgAESACPiLwIJS+mEGrj66jzr4gwMDVF09RTyJABIgAESACRIAIEAEXEZCN7D6GoDXVGmAXDaJORMBFBBi4uugV6kQEiAARIAJEgAgQASLgAwKywec5CFplcyMWIkAEFBFg4KoILlkTASJABIgAESACRIAIFBaBlbDsjxC0biyshTSMCDiEAANXh5xBVYgAESACRIAIEAEiQAS8QOA/oeWpCFoleGUhAkTAAgIMXC2ATBFEgAgQASJABIgAESAChUHgSVhyGoJWeT0QCxEgApYQYOBqCWiKIQJEgAgQASJABIgAEfAegQdgwVwErZu9t4QGEAHPEGDg6pnDqC4RIAJEgAgQASJABIhALgjcDqkfRdC6KxfpFEoESo4AA9eSNwCaTwSIABEgAkSACBABIjAgAv+AgPVPQfsHrMkKRIAIqCAwWIUrmRIBIkAEiAARIAJEgAgQAf8RkNnVv0DA+h3/TaEFRMBvBBi4+u0/ak8EiAARIAJEgAgQASKgg8BLYHsegtYXddiTKxEgAkkQYKpwErRYlwgQASJABIgAESACRKAMCHwXRp7IoLUMrqaNviDAGVdfPEU9iQARIAJEgAgQASJABLQR6ICAzyNglY2YWIgAEXAIAQauDjmDqhABIkAEiAARIAJEgAjkhsDvIPkTCFrlk4UIEAHHEGCqsGMOoTpEgAgQASJABIgAESACVhHYC2nfAJ3EoNUq7hRGBBIhwBnXRHCxMhEgAkSACBABIkAEiECBEHgUtlyGgPX3BbKJphCBQiLAGddCupVGEQEiQASIABEgAkSACDRBYC3OXYiA9f0MWpugxFNEwCEEGLg65AyqQgSIABEgAkSACBABIqCKwH5w/ybobQhY71GVROZEgAgYRYCpwkbhJDMiQASIABEgAkSACBABRxH4KfT6WwSsLziqH9UiAkSgCQIMXJuAw1NEgAgQASJABIgAESACXiPQBe3/FXQtAtbnvLaEyhOBkiPAwLXkDYDmEwEiQASIABEgAkSggAjsg013g76OgPWlAtpHk4hA6RBg4Fo6l9NgIkAEiAARIAJEgAgUFoE9sOx20HUIWNsKayUNIwIlRICBawmdTpOJABEgAkSACBABIlAwBCQN+C7Q3QhY1xfMNppDBIgAEGDgymZABIgAESACRIAIEAEi4CMCq6D090DfRbD6nz4aQJ2JABGIjwAD1/hYsSYRIAJEgAgQASJABIhAvgjsgHjZbElmVx9FwCqbL7EQASJQAgQYuJbAyTSRCBABIkAEiAARIAKeItAJvf8D9AjoUfkfwaocYyECRKBkCDBwLZnDaS4RIAJEgAgQASJABBxGQHYDfgYkQaoEq08gUN2FTxYiQARKjgAD15I3AJpPBIgAESACRIAIEIEcEOiAzP8CvdyHXkKgKunALESACBCBXggwcO0FB78QASJABIgAESACREANgf3gLAHbzuqn/F+kNZqSwru9B0kA2vP7NnxfCZJg9XUEqBE+WYgAESACsRBg4BoLJlYiAkSACBABIkAEiEAsBPai1jLQr0GvguRdou1CCNS24JOFCBABIkAEUiDAwDUFaLyECBABIkAEiAARIAJVBGTG9CnQ/aDHQc8iQN2DTxYiQASIABEwiAADV4NgkhURIAJEgAgQASJQGgSWwNI7QYsRqG4ojdU0lAgQASJABIgAESACRIAIEAEiQAR0EYiiaAwobdmGC/8RdIyuluROBIgAESACRIAIEAEiQASIABEgAqVFAEFnmsB1J677Bmh8aYGj4USACBABIkAEiAARIAJEgAgQASJgB4EUgesduGayHe0ohQgQASJABIgAESACRIAIEAEiQARKj0CCwPUl1D2j9IARACJABIgAESACRIAIEAEiQASIABGwi0DMwPWfUW+4Xc0ojQgQASJABIgAESACRIAIEAEiQASIABAYIHDdhfMXEigiQASIABEgAkSACBABIkAEiAARIAK5IdAkcF2Hc+/NTTEKJgJEgAgQASJABIgAESACRIAIEAEiIAg0CFxX4fgsIkQEiAARIAJEgAgQASJABIgAESACRCB3BOoErqtx7IjcFaMCRIAIEAEiQASIABEgAkSACBABIkAEBIE+gesWfJ9NZIgAESACRIAIEAEiQASIABEgAkSACDiDQI/AdT/+/4AzilERIkAEiAARIAJEgAgQASJABIgAESACgkCPwPXviQgRIAJEgAgQASJABIgAESACRIAIEAHnEKgGrk/hc5BzylEhIkAEiAARIAJEgAgQASJABIgAESACCFhHgo4lEkSACBABIkAEiAARIAJEgAgQASJABIgAESACRIAIEAFjCPx/2P3JeG4VmJoAAAAASUVORK5CYII=">>). + case misc:read_img("admin-logo.png") of + {ok, Img} -> Img; + {error, _} -> <<>> + end. logo_fill() -> - base64:decode(<<"iVBORw0KGgoAAAANSUhEUgAAAAYAAAA3BAMAAADdxCZzA" - "AAAAXNSR0IArs4c6QAAAB5QTFRF1nYO/ooC/o4O/pIS/p" - "4q/q5K/rpq/sqM/tam/ubGzn/S/AAAAEFJREFUCNdlw0s" - "RwCAQBUE+gSRHLGABC1jAAhbWAhZwC+88XdXOXb4UlFAr" - "SmwN5ekdJY2BkudEec1QvrVQ/r3xOlK9HsTvertmAAAAA" - "ElFTkSuQmCC">>). + case misc:read_img("admin-logo-fill.png") of + {ok, Img} -> Img; + {error, _} -> <<>> + end. %%%================================== %%%% process_admin diff --git a/src/misc.erl b/src/misc.erl index dffe17112..80824f03e 100644 --- a/src/misc.erl +++ b/src/misc.erl @@ -34,7 +34,7 @@ l2i/1, i2l/1, i2l/2, expr_to_term/1, term_to_expr/1, now_to_usec/1, usec_to_now/1, encode_pid/1, decode_pid/2, compile_exprs/2, join_atoms/2, try_read_file/1, have_eimp/0, - css_dir/0]). + css_dir/0, img_dir/0, js_dir/0, read_css/1, read_img/1, read_js/1]). %% Deprecated functions -export([decode_base64/1, encode_base64/1]). @@ -231,6 +231,40 @@ css_dir() -> Path -> Path end. +-spec img_dir() -> file:filename(). +img_dir() -> + case os:getenv("EJABBERD_IMG_PATH") of + false -> + case code:priv_dir(ejabberd) of + {error, _} -> filename:join(["priv", "img"]); + Path -> filename:join([Path, "img"]) + end; + Path -> Path + end. + +-spec js_dir() -> file:filename(). +js_dir() -> + case os:getenv("EJABBERD_JS_PATH") of + false -> + case code:priv_dir(ejabberd) of + {error, _} -> filename:join(["priv", "js"]); + Path -> filename:join([Path, "js"]) + end; + Path -> Path + end. + +-spec read_css(file:filename()) -> {ok, binary()} | {error, file:posix()}. +read_css(File) -> + read_file(filename:join(css_dir(), File)). + +-spec read_img(file:filename()) -> {ok, binary()} | {error, file:posix()}. +read_img(File) -> + read_file(filename:join(img_dir(), File)). + +-spec read_js(file:filename()) -> {ok, binary()} | {error, file:posix()}. +read_js(File) -> + read_file(filename:join(js_dir(), File)). + %%%=================================================================== %%% Internal functions %%%=================================================================== @@ -242,3 +276,14 @@ set_node_id(PidStr, NodeBin) -> [H|_] = string:tokens(ExtPidStr, "."), [_|T] = string:tokens(PidStr, "."), erlang:list_to_pid(string:join([H|T], ".")). + +-spec read_file(file:filename()) -> {ok, binary()} | {error, file:posix()}. +read_file(Path) -> + case file:read_file(Path) of + {ok, Data} -> + {ok, Data}; + {error, Why} = Err -> + ?ERROR_MSG("Failed to read file ~s: ~s", + [Path, file:format_error(Why)]), + Err + end. diff --git a/src/mod_bosh.erl b/src/mod_bosh.erl index ed12d569c..6ee580477 100644 --- a/src/mod_bosh.erl +++ b/src/mod_bosh.erl @@ -337,58 +337,16 @@ get_container_children(Heading) -> ]. get_style_cdata() -> - <<" - body { - margin: 0; - padding: 0; - font-family: sans-serif; - color: #fff; - } - h1 { - font-size: 3em; - color: #444; - } - p { - line-height: 1.5em; - color: #888; - } - a { - color: #fff; - } - a:hover, - a:active { - text-decoration: underline; - } - .container { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: #424A55; - background-image: -webkit-linear-gradient(270deg, rgba(48,52,62,0) 24%, #30353e 100%); - background-image: linear-gradient(-180deg, rgba(48,52,62,0) 24%, #30353e 100%); - } - .section { - padding: 3em; - } - .white.section { - background: #fff; - border-bottom: 4px solid #41AFCA; - } - .white.section a { - text-decoration: none; - color: #41AFCA; - } - .white.section a:hover, - .white.section a:active { - text-decoration: underline; - } - .block { - margin: 0 auto; - max-width: 900px; - width: 100%; - }">>. + case misc:read_css("bosh.css") of + {ok, Data} -> Data; + {error, _} -> <<>> + end. get_image_src() -> - <<"data:image/png;base64,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">>. + case misc:read_img("bosh-logo.png") of + {ok, Img} -> + B64Img = base64:encode(Img), + <<"data:image/png;base64,", B64Img/binary>>; + {error, _} -> + <<>> + end. diff --git a/src/mod_muc_log.erl b/src/mod_muc_log.erl index cd4e195da..eba302337 100644 --- a/src/mod_muc_log.erl +++ b/src/mod_muc_log.erl @@ -502,186 +502,22 @@ make_dir_rec(Dir) -> %% c("../../ejabberd/src/jlib.erl"). %% base64:encode(F1b). -image_base64(<<"powered-by-erlang.png">>) -> - <<"iVBORw0KGgoAAAANSUhEUgAAAGUAAAAfCAYAAAD+xQNoA" - "AADN0lEQVRo3u1aP0waURz+rjGRRQ+nUyRCYmJyDPTapD" - "ARaSIbTUjt1gVSh8ZW69aBAR0cWLSxCXWp59LR1jbdqKn" - "GxoQuRZZrSYyHEVM6iZMbHewROA7u3fHvkr5vOn737vcu" - "33ffu9/vcQz+gef5Cij6CkmSGABgFEH29r5SVvqIsTEOH" - "o8HkiQxDBXEOjg9PcHc3BxuUSqsI8jR0REAUFGsCCoKFY" - "WCBAN6AxyO0Z7cyMXFb6oGqSgAsIrJut9hMQlvdNbUhKW" - "shLd3HtTF4jihShgVpRaBxKKmIGX5HL920/hz/BM2+zAm" - "pn2YioQaxnECj0BiEYcrG0Tzzc8/rfudSm02jaVSm9Vr1" - "MdG8rSKKXlJ7lHrfjouCut2IrC82BDPbe/gc+xlXez7Kx" - "Ez63H4lmIN473Rh8Si1BKhRY6aEJI8pLmbjSPN0xOnBBI" - "Lmg5RC6Lg28preKOzsNmHG8R1Bf0o7GdMucUslDy1pJLG" - "2sndVVG0lq3c9vum4zmBR1kuwiYMN5ybmCYXxQg57ThFO" - "TYznzpPO+IQi+IK+jXjg/YhuIJ+cIIHg+wQJoJ+2N3jYN" - "3Olvk4ge/IU98spne+FfGtlslm16nna8fduntfDscoVjG" - "JqUgIjz686ViFUdjP4N39x9Xq638viZVtlq2tLXKncLf5" - "ticuZSWU5XOUshJKxxKtfdtdvs4OyNb/68urKvlluYizg" - "wwu5SLK8jllu1t9ihYOlzdwdpBBKSvh+vKKzHkCj1JW3y" - "1m+hSj13WjqOiJKK0qpXKhSFxJAYBvKYaZ9TjWRu4SiWi" - "2LyDtb6wghGmn5HfTml16ILGA/G5al2DW7URYTFYrOU7g" - "icQ020sYqYDM9CbdgqFd4vzHL03JfvLjk6ZgADAVCSEsJ" - "vHsdL+utNYrm2ufZDVZSkzPKaQkW8kthpyS297BvRdRzR" - "6DdTurJbPy9Ov1K6xr3HBPQuIMowR3asegUyDuU9SuUG+" - "dmIGyZ0b7FBN9St3WunyC5yMsrVv7uXzRP58s/qKn6C4q" - "lQoVxVIvd4YBwzBUFKs6ZaD27U9hEdcAN98Sx2IxykafI" - "YrizbfESoB+dd9/KF/d/wX3cJvREzl1vAAAAABJRU5Erk" - "Jggg==">>; -image_base64(<<"valid-xhtml10.png">>) -> - <<"iVBORw0KGgoAAAANSUhEUgAAAFgAAAAfCAMAAAEjEcpEA" - "AACiFBMVEUAAADe5+fOezmtra3ejEKlhELvvWO9WlrehE" - "LOe3vepaWclHvetVLGc3PerVKcCAj3vVqUjHOUe1JjlL0" - "xOUpjjL2UAAC91ueMrc7vrVKlvdbW3u+EpcbO3ufO1ucY" - "WpSMKQi9SiF7e3taWkoQEAiMczkQSoxaUkpzc3O1lEoIC" - "ACEazEhGAgIAACEYzFra2utjELWcznGnEr/7+9jY2POaz" - "HOYzGta2NShLVrlL05OUqctdacCADGa2ucAADGpVqUtc6" - "1ORg5OTmlUikYGAiUezl7YzEYEAiUczkxMTG9nEqtIRDe" - "3t4AMXu9lEoQCACMazEAKXspKSmljFrW1ta1jELOzs7n7" - "/fGxsa9pVqEOSkpY5xznL29tZxahLXOpVr/99ZrY1L/79" - "ZjUiljSikAOYTvxmMAMYScezmchFqUczGtlFp7c2utjFq" - "UlJStxt73///39/9Ce61CSkq9xsZznMbW5+9Cc62MjIxC" - "Qkrv9/fv7/fOzsbnlErWjIz/3mtCORhza1IpIRBzWjH/1" - "mtCMRhzY1L/zmvnvVpSQiHOpVJrUinntVr3zmOEc1L3xm" - "NaWlq1nFo5QkrGWim1lFoISpRSUlK1zt4hWpwASoz////" - "///8xa6WUaykAQoxKe61KSkp7nMbWtWPe5+9jWlL39/f3" - "9/fWrWNCQkLera3nvWPv7+85MRjntWPetVp7c1IxKRCUl" - "HtKORh7a1IxIRCUjHtaSiHWrVIpIQhzWinvvVpaQiH/1m" - "PWpVKMe1L/zmP/xmNrUiGErc4YGBj/73PG1ucQWpT/53O" - "9nFoQUpS1SiEQEBC9zt69vb05c6UISoxSUko5a6UICAhS" - "SkohUpS1tbXetWMAQoSUgD+kAAAA2HRSTlP/////////i" - "P9sSf//dP////////////////////////////////////" - "////////////8M////////////ef/////////////////" - "/////////////////////////////////////////////" - "//////////////////////9d/////////////////////" - "///////////////AP//////////////CP//RP////////" - "/////////////////////////////////////////////" - "///////9xPp1gAAAFvUlEQVR42pVWi18URRwfy7vsYUba" - "iqBRBFmICUQGVKcZckQeaRJQUCLeycMSfKGH0uo5NELpI" - "vGQGzokvTTA85VHKTpbRoeJnPno/p1+M7t3txj20e/Nzu" - "7Ofve7v/k9Zg4Vc+wRQMW0eyLx1ZSANeBDxVmxZZSwEUY" - "kGAewm1eIBOMRvhv1UA+q8KXIVuxGdCelFYwxAnxOrxgb" - "Y8Ti1t4VA0QHYz4x3FnVC8OVLXv9fkKGSWDoW/4lG6Vbd" - "tBblesOs+MjmEmzJKNIJWFEfEQTCWNPFKvcKEymjLO1b8" - "bwYQd1hCiiDCl5KsrDCIlhj4fSuvcpfSpgJmyv6dzeZv+" - "nMPx3dhbt94II07/JZliEtm1N2RIYPkTYshwYm245a/zk" - "WjJwcyFh6ZIcYxxmqiaDSYxhOhFUsqngi3Fzcj3ljdYDN" - "E9uzA1YD/5MhnzW1KRqF7mYG8jFYXLcfLpjOe2LA0fuGq" - "QrQHl10sdK0sFcFSOSlzF0BgXQH9h3QZDBI0ccNEhftjX" - "uippBDD2/eMRiETmwwNEYHyqhdDyo22w+3QHuNbdve5a7" - "eOkHmDVJ0ixNmfbz1h0qo/Q6GuSB2wQJQbpOjOQAl7woW" - "SRJ0m2ewhvAOUiYYtZtaZL0CZZmtmVOQttLfr/dbveLZo" - "drfrL7W75wG/JjqkQxoNTtNsTKELQpQL6/D5loaSmyTT8" - "TUhsmi8iFA0hZiyltf7OiNKdarRm5w2So2lTNdPLuIzR+" - "AiLj8VTRJaj0LmX4VhJ27f/VJV/yycilWPOrk8NkXi7Qq" - "mj5bHqVZlJKZIRk1wFzKrt0WUbnXMPJ1fk4TJ5oWBA61p" - "1V76DeIs0MX+s3GxRlA1vtw83KhgNphc1nyErLO5zcvbO" - "srq+scbZnpzc6QVFPenLwGxmC+BOfYI+DN55QYddh4Q/N" - "E/yGYYj4TOGNngQavAZnzzTovEA+kcMJ+247uYexNA+4F" - "svjmuv662jsWxPZx2xg890bYMYnTgya7bjmCiEY0qgJ0v" - "MF3c+NoFdPyzxz6V3Uxs3AOWCDchRvOsQtBrbFsrT2fhH" - "Ec7ByGzu/dA4IO0A3HdfeP9yMqAwP6NPEb6cbwn0PWVU1" - "7/FDBQh/CPIrbfcg027IZrsAT/Bf3FNWyn9RSR4cvvwn3" - "e4HFmYPDl/thYcRVi8qPEoXVUWBl6FTBFTtnqmKKg5wnl" - "F4wZ1yeLv7TiwXKektE+iDBNicWEyLpnFhfDkpJc3q2kh" - "SPyQBbE0dMJnOoDzTwGsI7cdyMkL5gWqUjCF6Txst/twx" - "Cv1WzzHoy21ZDQ1xnuDzdPDWR4knr14v0tYn3IxaMFFdi" - "MOlEOJHw1jOQ4sWt5rQopRkXZhMEi7pmeDCVWBlfUKwhM" - "Z7rsF6elKsvbwiKxgxIdewa3ErsaYomCVZFYJb0GUu3Jq" - "GUNoplBxYiYby8vLBFWef+Cri4/I1sbQ/1OtYTrNtdXS+" - "rSe7kQ52eSObL99/iErCWUjCy5W4JLygmCouGfG9x9fmx" - "17XhBuDCaOerbt538erta7TFktLvdHghZcCbcPQO33zIJ" - "G9kxF5hoVXnzTzRz0r5js8oTj6uyPkGRf346HOLcasgFe" - "xueNUWFPtuFKzjoSFYYedhwVlhsRVYWWJpltv1XPQT1Rl" - "0bjZIBlb1XujVDzY/Kj4k6Ku3+Z0jo1owjVzDpFTXe1ju" - "vBSWNFmNWGZy8LvzUl5PN4JCwyNDzbQ0aAj4Zrjz0FatG" - "JJYhvq4j7mGSpvytGFlZtHf2C4o/28Zu8z7wo7eYPfXys" - "nF0i9NnPh1t1zR7VBb9GqaOXhtTmHQdgMFXE+Z608cnpO" - "DdZdjL+TuDY44Q38kJXHhccWLoOd9uv1AwwvO+48uu+fa" - "CSJPJ1bmy6ThyvpivBmYWgjxPDPAp7JTemY/yGKFEiRt/" - "jG/2P79s8KCwoLCgoLC/khUBA5F0SfQZ+RYfpNE/4Xosm" - "q7jsZAJsAAAAASUVORK5CYII=">>; -image_base64(<<"vcss.png">>) -> - <<"iVBORw0KGgoAAAANSUhEUgAAAFgAAAAfCAMAAABUFvrSA" - "AABKVBMVEUAAAAjIx8MR51ZVUqAdlmdnZ3ejEWLDAuNjY" - "1kiMG0n2d9fX19Ghfrp1FtbW3y39+3Ph6lIRNdXV2qJBF" - "cVUhcVUhPT0/dsmpUfLr57+/u7u4/PDWZAACZAADOp1Gd" - "GxG+SyTgvnNdSySzk16+mkuxw+BOS0BOS0DOzs7MzMy4T" - "09RRDwsJBG+vr73wV6fkG6eCQRFcLSurq6/X1+ht9nXfz" - "5sepHuwV59ZTHetFjQ2+wMCQQ2ZK5tWCsmWajsz8+Sq9N" - "MPh4hVaY8MRj///////////////////////9MTEyOp9Lu" - "8vhXU1A8PDyjOSTBz+YLRJ2rLy8sLCwXTaKujEUcHByDn" - "82dfz7/zGafDw+fDw+zRSlzlMcMDAyNcji1tbXf5vIcFg" - "vATJOjAAAAY3RSTlP/8/////////////////8A//////P" - "/////ov//8//////////////z///T//////////+i////" - "//////////8w/////6IA/xAgMP//////////8////////" - "/8w0/////////+zehebAAACkUlEQVR42u2VfVPTQBDG19" - "VqC6LY+lKrRIxFQaFSBPuSvhBPF8SIUZK2J5Yav/+HcO8" - "uZdLqTCsU/nKnyWwvk1/unnt2D9ZmH+8/cMAaTRFy+ng6" - "9/yiwC/+gy8R3McGv5zHvGJEGAdR4eBgi1IbZwevIEZE2" - "4pFtBtzG1Q4AoD5zvw5pEDcJvIQV/TE3/l+H9GnNJwcdA" - "BS5wAbFQLMqI98/UReoAaOTlaJsp0zaHx7LwZvY0BUR2x" - "pWTzqam0gzY8KGzG4MhBCNGucha4QbpETy+Yk/BP85nt7" - "34AjpQLTsE4ZFpf/dnkUCglXVNYB+OfUZJHvAqAoa45Oe" - "uPgm4+Xjtv7xm4N7PMV4C61+Mrz3H2WImm3ATiWrAiwZR" - "WcUA5Ej4dgIEMxDv6yxHHcNuAutnjv2HZ1NeuycoVPh0m" - "wC834zZC9Ao5dkZZKwLVGwT+WdLw0YOZ1saEkUDoT+QGW" - "KZ0E2xpcrPakVW2KXwyUtYEtlEAj3GXD/fYwrryAdeiyG" - "qidQSw1eqtJcA8cZq4zXqhPuCBYE1fKJjh/5X6MwRm9c2" - "xf7WVdLf5oSdt64esVIwVAKC1HJ2oli8vj3L0YzC4zjkM" - "agt+arDAs6bApbL1RVlWIqrJbreqKZmh4y6VR7rAJeUYD" - "VRj9VqRXkErpJ9lbEwtE83KlIfeG4p52t7zWIMO1XcaGz" - "54uUyet+hBM7BXXDS8Xc5+8Gmmbu1xwSoGIokA3oTptQe" - "cQ4Iimm/Ew7jwbPfMi3TM91T9XVIGo+W9xC8oWpugVCXL" - "uwXijjxJ3r/6PjX7nlFua8QmyM+TO/Gja2TTc2Z95C5ua" - "ewGH6cJi6bJO6Z+TY276eH3tbgy+/3ly3Js+rj66osG/A" - "V5htgaQ9SeRAAAAAElFTkSuQmCC">>; -image_base64(<<"powered-by-ejabberd.png">>) -> - <<"iVBORw0KGgoAAAANSUhEUgAAAGUAAAAfCAMAAADJG/NaA" - "AAAw1BMVEUAAAAjBgYtBAM5AwFCAAAYGAJNAABcAABIDQ" - "5qAAAoJRV7AACFAAAoKSdJHByLAAAwLwk1NQA1MzFJKyo" - "4NxtDQQBEQT5KSCxSTgBSUBlgQ0JYSEpZWQJPUU5hYABb" - "W0ZiYClcW1poaCVwbQRpaDhzYWNsakhuZ2VrbFZ8dwCEg" - "AB3dnd4d2+OjACDhYKcmACJi4iQkpWspgCYmJm5swCmqa" - "zEwACwsbS4ub3X0QLExsPLyszW1Nnc3ODm5ugMBwAWAwP" - "Hm1IFAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJ" - "cEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfVCRQOBA7VB" - "kCMAAACcElEQVRIx72WjXKiMBSFQalIFbNiy1pdrJZaRV" - "YR5deGwPs/VRNBSBB2OjvQO0oYjPfj5J6bCcdx8i2Uldx" - "KcDhk1HbIPwFBF/kHKJfjPSVAyIRHF9rRZ4sUX3EDdWOv" - "1+u2tESaavpnYTbv9zvd0WwDy3/QcGQXlH5uTxB1l07MJ" - "lRpsUei0JF6Qi+OHyGK7ijXxPklHe/umIllim3iUBMJDI" - "EULxxPP0TVWhhKJoN9fUpdmQLteV8aDgEAg9gIcTjL4F4" - "L+r4WVKEF+rbJdwYYAoQHY+oQjnGootyKwxapoi73WkyF" - "FySQBv988naEEp4+YMMec5VUCQDJTscEy7Kc0HsLmqNE7" - "rovDjMpIHHGYeidXn4TQcaxMYqP3RV3C8oCl2WvrlSPaN" - "pGZadRnmPGCk8ylM2okAJ4i9TEe1KersXxSl6jUt5uayi" - "IodirtcKLOaWblj50wiyMv1F9lm9TUDArGAD0FmEpvCUs" - "VoZy6dW81Fg0aDaHogQa36ekAPG5DDGsbdZrGsrzZUnzv" - "Bo1I2tLmuL69kSitAweyHKN9b3leDfQMnu3nIIKWfmXnq" - "GVKedJT6QpICbJvf2f8aOsvn68v+k7/cwUQdPoxaMoRTn" - "KFHNlKsKQphCTOa84u64vpi8bH31CqsbF6lSONRTkTyQG" - "Arq49/fEvjBwz4eDS2/JpaXRNOoXRD/VmOrDVTJJRIZCT" - "Lav3VrqbPvP3vdduGEhQJzilncbpSA4F3vsihErO+dayv" - "/sY5/yRE0GDEXCu2VoNiMlo5i+P2KlgMEvTNk2eYa5XEy" - "h12Ex17Z8vzQUR3KEPbYd6XG87eC4Ly75RneS5ZYHAAAA" - "AElFTkSuQmCC">>. - create_image_files(Images_dir) -> + ?INFO_MSG("here = ~p", [Images_dir]), Filenames = [<<"powered-by-ejabberd.png">>, <<"powered-by-erlang.png">>, <<"valid-xhtml10.png">>, <<"vcss.png">>], - lists:foreach(fun (Filename) -> - Filename_full = fjoin([Images_dir, Filename]), - {ok, F} = file:open(Filename_full, [write]), - Image = base64:decode(image_base64(Filename)), - io:format(F, <<"~s">>, [Image]), - file:close(F) - end, - Filenames), - ok. + lists:foreach( + fun(Filename) -> + Src = filename:join([misc:img_dir(), Filename]), + Dst = fjoin([Images_dir, Filename]), + case file:copy(Src, Dst) of + {ok, _} -> ok; + {error, Why} -> + ?ERROR_MSG("Failed to copy ~s to ~s", + [Src, Dst, file:format_error(Why)]) + end + end, Filenames). fw(F, S) -> fw(F, S, [], html). @@ -768,77 +604,10 @@ put_header(F, Room, Date, CSSFile, Lang, Hour_offset, put_header_css(F, false) -> fw(F, <<"">>); put_header_css(F, CSSFile) -> @@ -849,16 +618,10 @@ put_header_css(F, CSSFile) -> put_header_script(F) -> fw(F, <<"">>). put_room_config(_F, _RoomConfig, _Lang, plaintext) ->