From 5b5fa8abc82afa08f88892a82dca4ad5ec1ffb41 Mon Sep 17 00:00:00 2001 From: Tobias Gawron-Deutsch Date: Fri, 5 Oct 2018 23:00:51 +0200 Subject: [PATCH 1/4] added code documentation --- lysidike/publishgateway.py | 49 +++++++++++++++- lysidike/services/aservice.py | 49 ++++++++++++++-- lysidike/services/emailservice.py | 42 ++++++++++--- lysidike/services/servicefactory.py | 32 ++++++++++ lysidike/services/stdoutservice.py | 14 +++++ lysidike/tasks/task.py | 91 ++++++++++++++++++++++------- lysidike/tasks/taskfactory.py | 9 +++ 7 files changed, 251 insertions(+), 35 deletions(-) diff --git a/lysidike/publishgateway.py b/lysidike/publishgateway.py index 7a44473..9afbc26 100644 --- a/lysidike/publishgateway.py +++ b/lysidike/publishgateway.py @@ -6,12 +6,57 @@ import lysidike class PublishGateway(AbstractMicroservice): + """ + Provides the possibility to publish aggregated mqtt messages to various services. Several tasks listen to + incoming messages, render messages and publishes them to the service. + + config yaml structure + mqtt: + mqtt-address: localhost + mqtt-port: 1883 + credentials-file: ~/credentials.yaml + log-level: WARNING + + logger: + log-level: DEBUG + log-file: lysidike.log + + publish-gateway: + services: + email: + address: smtp.zoho.com + port: 465 + from: name123@sender123.com + to: name123@receiver123.com + credentials-file: ~/credentials.yaml + stdout: + prefix: ------------------------------------------------------------------------------ + suffix: .............................................................................. + tasks: + - name: collection + service: stdout # [email, stdout, ...] one of the services + subject: sending collected messages # subject for message + every-nth-message: 10 # collect this amount of messages before publishing them. 0 for never + every-nth-second: 10 # wait this time before publishing all messages that are waiting. 0 for never + topics-sub: + - /test/a + - /test/b + - name: ... + + """ _version = lysidike.version - _services = None - _tasks = None + _services = None # list of services + _tasks = None # list of tasks def __init__(self, config, mqtt_client=None, logger=None): + """ + Constructor - creates the services and the tasks + + :param config: config yaml structure + :param mqtt_client: mqtt client instance + :param logger: logger instance + """ AbstractMicroservice.__init__(self, config, "publish-gateway", mqtt_client, logger) self._services = ServiceFactory.get_services(self._config["services"], mqtt_client, logger) self._tasks = TaskFactory.get_tasks(self._config["tasks"], self._services, mqtt_client, logger) diff --git a/lysidike/services/aservice.py b/lysidike/services/aservice.py index 6d91482..13faa24 100644 --- a/lysidike/services/aservice.py +++ b/lysidike/services/aservice.py @@ -2,12 +2,27 @@ from pelops import mylogger class AService: - _mqtt_client = None - _logger = None - _config = None - last_message = None + """ + Abstract service - an implementation of it provides everything that is needed to publish the message + to a messaging service like email or to output it to e.g. stdout. + + Abstact service has no config yaml entries. + """ + + _mqtt_client = None # mqtt_client instance + _logger = None # logger + _config = None # yaml config structure + last_message = None # contains the last rendered message def __init__(self, config, mqtt_client, logger_name, logger): + """ + Constructor + + :param config: yaml config structure + :param mqtt_client: mqtt_client instance + :param logger: logger instance from the parent. a child will be spawned + :param logger_name: name for the child instance + """ self._logger = mylogger.get_child(logger, logger_name) self._mqtt_client = mqtt_client self._config = config @@ -16,6 +31,10 @@ class AService: self._logger.debug("{}.__init__ config: {}".format(self.__class__.__name__, self._config)) def start(self): + """ + start the service - calls self._start and + :raises RuntimeError if self._test_connection returns fals + """ self._logger.info("{}.start - starting".format(self.__class__.__name__)) self._start() if not self._test_connection(): @@ -24,6 +43,9 @@ class AService: self._logger.info("{}.start - started".format(self.__class__.__name__)) def stop(self): + """ + stops the service - calls self._stop + """ self._logger.info("{}.stop - stopping".format(self.__class__.__name__)) self._stop() self._logger.info("{}.stop - stopped".format(self.__class__.__name__)) @@ -47,9 +69,15 @@ class AService: self._logger.info("{}.publish - finished".format(self.__class__.__name__)) def _start(self): + """ + initialise service + """ raise NotImplementedError def _stop(self): + """ + stop service + """ raise NotImplementedError def _test_connection(self): @@ -60,7 +88,20 @@ class AService: raise NotImplementedError def _render_message(self, messages): + """ + takes the list of received messages (in the order they were received) and generates a message in a format + that fits the service type + + :param messages: list of received messages. each entry is a tuple (timestamp, topic, message) + :return: message + """ raise NotImplementedError def _send_message(self, subject, message): + """ + sends a message with given subject to the service + + :param subject: subject as defined in config yaml - provided by task + :param message: message to be published + """ raise NotImplementedError diff --git a/lysidike/services/emailservice.py b/lysidike/services/emailservice.py index 02b6e2d..e77f367 100644 --- a/lysidike/services/emailservice.py +++ b/lysidike/services/emailservice.py @@ -4,15 +4,43 @@ from email.mime.text import MIMEText class EmailService(AService): - _address = None - _port = None - _username = None - _password = None - _from = None - _to = None - _server = None + """ + Classic publish to email service. + + config yaml entries: + + email: + address: smtp.zoho.com # url of smtp server + port: 465 # port of smtp server + from: name123@sender123.com # sender email address + to: name123@receiver123.com # send to email address + credentials-file: ~/credentials.yaml # a yaml config file with one root entry as described below + + credentials yaml file: + + publish-gateway: + services: + email: + username: username # username for smtp server + password: password # password for smtp server + """ + + _address = None # url of smtp server + _port = None # port of smtp server + _username = None # username for smtp server + _password = None # password for smtp server + _from = None # sender email address + _to = None # send to email address def __init__(self, config, mqtt_client, logger): + """ + Constructor + + :param config: yaml config structure + :param mqtt_client: mqtt_client instance + :param logger: logger instance from the parent. a child will be spawned + """ + AService.__init__(self, config, mqtt_client, __name__, logger) self._address = self._config["address"] self._port = self._config["port"] diff --git a/lysidike/services/servicefactory.py b/lysidike/services/servicefactory.py index b0c418c..0dbb3eb 100644 --- a/lysidike/services/servicefactory.py +++ b/lysidike/services/servicefactory.py @@ -2,8 +2,21 @@ from pelops import mylogger class ServiceFactory: + """ + generate instances of the services + """ + @staticmethod def get_service(service_type, config, mqtt_client, logger): + """ + Create a service with the provided parameters + + :param service_type: name of service type + :param config: config parameters for service + :param mqtt_client: mqtt client instance + :param logger: logger instance + :return: instance of the service + """ factory_logger = mylogger.get_child(logger, __name__) factory_logger.info(" - creating service") factory_logger.debug(" - service config: ".format(config)) @@ -22,6 +35,25 @@ class ServiceFactory: @staticmethod def get_services(config, mqtt_client, logger): + """ + creates a list of serives. + + config yaml structures: + email: + address: smtp.zoho.com + port: 465 + from: name123@sender123.com + to: name123@receiver123.com + credentials-file: ~/credentials.yaml + stdout: + prefix: ------------------------------------------------------------------------------ + suffix: .............................................................................. + + :param config: config yaml structure + :param mqtt_client: mqtt client instance + :param logger: logger instance + :return: list of service instances + """ factory_logger = mylogger.get_child(logger, __name__) factory_logger.info("creating services - starting") factory_logger.debug("service configs: ".format(config)) diff --git a/lysidike/services/stdoutservice.py b/lysidike/services/stdoutservice.py index a2fc1ba..e7bef35 100644 --- a/lysidike/services/stdoutservice.py +++ b/lysidike/services/stdoutservice.py @@ -3,10 +3,24 @@ import datetime class StdOutService(AService): + """ + Writes the collected messages to stdout. + + stdout: + prefix: ------------ # first line of output + suffix: ............ # last line of output + """ _prefix = None _suffix = None def __init__(self, config, mqtt_client, logger): + """ + Constructor + + :param config: yaml config structure + :param mqtt_client: mqtt_client instance + :param logger: logger instance from the parent. a child will be spawned + """ AService.__init__(self, config, mqtt_client, __name__, logger) self._prefix = self._config["prefix"] self._suffix = self._config["suffix"] diff --git a/lysidike/tasks/task.py b/lysidike/tasks/task.py index 94b40b7..b83fb93 100644 --- a/lysidike/tasks/task.py +++ b/lysidike/tasks/task.py @@ -4,29 +4,55 @@ import datetime class Task: - _config = None - _mqtt_client = None - _logger = None - - _topics_sub = None - _message_handler = None - - _service = None - _subject = None - name = None - - _every_nth_message = None - _use_every_message = None - - _every_nth_second = None - _use_every_second = None - _loop_thread = None - _stop_loop = None - - _message_list = None - _lock_list = None + """ + A task collects messages from n topics and publishes them a specific service after x seconds and/or y messages. + Each call of publish the list of received messages is processed and emptied. Thus, two consecutive calls of + publish will produce two different messages (or two empties with an empty list). To ensure this behavior, a lock + is used to block access to the list. + + config yaml structure: + - name: collection + service: stdout # [email, stdout, ...] one of the services + subject: sending collected messages # subject for message + every-nth-message: 10 # collect this amount of messages before publishing them. 0 for never + every-nth-second: 10 # wait this time before publishing all messages that are waiting. 0 for never + topics-sub: + - /test/a + - /test/b + - /test/c + """ + + _config = None # config yaml structure + _mqtt_client = None # mqtt client instance + _logger = None # logger instance + + _topics_sub = None # list of subscribed topics + _message_handler = None # list of the handlers for the subscribed topics + + _service = None # instance of the service to be used + _subject = None # subject for each publish message + name = None # name of the service + + _every_nth_message = None # collect this amount of messages before publishing them. 0 for never + _use_every_message = None # true if _every_nth_message > 0 + + _every_nth_second = None # wait this time before publishing all messages that are waiting. 0 for never + _use_every_second = None # true if _use_every_second > 0 + _loop_thread = None # thread for timer loop + _stop_loop = None # event signals that timer loop should stop + + _message_list = None # list of unprocessed messages received from all topics + _lock_list = None # locks the message list (mutual exclusive access for renderer and handler) def __init__(self, config, services, mqtt_client, logger): + """ + Constructor + + :param config: config yaml structure + :param services: list of services created by servicefactory + :param mqtt_client: mqtt client instances + :param logger: logger instance + """ self._config = config self.name = self._config["name"] self._mqtt_client = mqtt_client @@ -64,6 +90,10 @@ class Task: self._logger.info("Task.__init__ - finished") def _create_handler(self, handler_topic): + """ + For each sub topic a handler is created that adds incoming messages to the list of messages that are processed + into an outgoing message. + """ def _handler(message): timestamp = datetime.datetime.now() entry = (timestamp, handler_topic, message) @@ -80,11 +110,18 @@ class Task: return _handler def _handler_post_processor(self): + """ + after each added message to the list, the system checks if list size is larger than _every_nth_message. if + yes, publish message is called. + """ if self._use_every_message and len(self._message_list) >= self._every_nth_message: self._logger.info("Task._handler_post_processer - message_list size: {}.".format(len(self._message_list))) self._publish() def _loop(self): + """ + if _every_nth_second is set, this method waits n seconds and publishes all messages in the list. + """ self._logger.info("Task._loop - start loop") while not self._stop_loop.is_set(): self._logger.info("Task._loop - wait for {} seconds.".format(self._every_nth_second)) @@ -95,6 +132,10 @@ class Task: self._publish() def _publish(self): + """ + A copy of the received messages is given to the service handler and published. The stored messages are cleared + afterwards. The list is protected by _lock_list during processing. + """ self._logger.info("Task._publish - start") with self._lock_list: self._logger.debug("Task._publish - lock acquired") @@ -106,6 +147,9 @@ class Task: self._logger.info("Task._publish - finished") def start(self): + """ + Starts the task (if timer is used, a thread with _loop is started) and subscribes to all sub topics. + """ self._logger.info("Task.start - starting") if self._use_every_second: self._logger.info("Task.start - start loop") @@ -118,6 +162,9 @@ class Task: self._logger.info("Task.start - finished") def stop(self): + """ + Stops the task (and the timer thread) and unsubscribes from the topics. + """ self._logger.info("Task.stop - stopping") self._logger.info("Task.start - unregister {} topics".format(len(self._message_handler.items()))) for topic, handler in self._message_handler.items(): @@ -127,4 +174,4 @@ class Task: self._logger.info("Task.start - stop loop") self._stop_loop.set() self._loop_thread.join() - self._logger.info("Task.stop - finished") \ No newline at end of file + self._logger.info("Task.stop - finished") diff --git a/lysidike/tasks/taskfactory.py b/lysidike/tasks/taskfactory.py index 793d23f..323e796 100644 --- a/lysidike/tasks/taskfactory.py +++ b/lysidike/tasks/taskfactory.py @@ -5,6 +5,15 @@ from lysidike.tasks.task import Task class TaskFactory: @staticmethod def get_tasks(config, services, mqtt_client, logger): + """ + Creates a list of tasks. + + :param config: config yaml structure + :param services: list of services created by service factory + :param mqtt_client: mqtt client instance + :param logger: logger instance + :return: list of tasks + """ factory_logger = mylogger.get_child(logger, __name__) factory_logger.info("creating tasks - starting") factory_logger.debug("task configs: ".format(config)) -- GitLab From 48dafb495d9b04b84f6ee6b7ccdde4a13fa8eb91 Mon Sep 17 00:00:00 2001 From: Tobias Gawron-Deutsch Date: Fri, 9 Nov 2018 10:51:09 +0100 Subject: [PATCH 2/4] . --- .gitignore | 3 +++ tests_manual/.gitignore | 5 ++++- tests_unit/.gitignore | 5 ++++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 3fd6e83..e626ae4 100755 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,7 @@ build/* Lysidike.egg-info/* README.rst *.log +*.log.[0-9] +*.log.[0-9][0-9] +*.log.[0-9][0-9][0-9] .eggs \ No newline at end of file diff --git a/tests_manual/.gitignore b/tests_manual/.gitignore index 7ccf339..283d2c7 100755 --- a/tests_manual/.gitignore +++ b/tests_manual/.gitignore @@ -2,4 +2,7 @@ *.txt *.html *.csv -*.log \ No newline at end of file +*.log +*.log.[0-9] +*.log.[0-9][0-9] +*.log.[0-9][0-9][0-9] \ No newline at end of file diff --git a/tests_unit/.gitignore b/tests_unit/.gitignore index 7ccf339..283d2c7 100755 --- a/tests_unit/.gitignore +++ b/tests_unit/.gitignore @@ -2,4 +2,7 @@ *.txt *.html *.csv -*.log \ No newline at end of file +*.log +*.log.[0-9] +*.log.[0-9][0-9] +*.log.[0-9][0-9][0-9] \ No newline at end of file -- GitLab From 7837b4feaa5f15dc17f91bf673b386d16168f520 Mon Sep 17 00:00:00 2001 From: Tobias Gawron-Deutsch Date: Tue, 13 Nov 2018 22:23:02 +0100 Subject: [PATCH 3/4] added command line script lysdike in setup.py --- setup.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/setup.py b/setup.py index 0a40326..25a6141 100755 --- a/setup.py +++ b/setup.py @@ -39,10 +39,10 @@ setup( "pelops>=0.1", ], test_suite="tests_unit", -# entry_points={ -# 'console_scripts': [ -# 'alcathous = alcathous.datapointmanager:standalone', -# ] -# }, + entry_points={ + 'console_scripts': [ + 'lysidike = lysidike.publishgateway:standalone', + ] + }, ) -- GitLab From 71aea70fab46ac43a61f40f065bee0d275eda53c Mon Sep 17 00:00:00 2001 From: Tobias Gawron-Deutsch Date: Mon, 19 Nov 2018 23:25:09 +0100 Subject: [PATCH 4/4] . --- img/Microservice Overview.png | Bin 28811 -> 31624 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/img/Microservice Overview.png b/img/Microservice Overview.png index eb0069bbfc9de569b840e5ec6f7ed4d77aef38ac..92dc299e270169996e9b09534c29fff39c06c940 100644 GIT binary patch literal 31624 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≤V2Xmi&P zXj!R-MRYcq-^jcUXr=gU@W_Qhh5~pCx27t%Ae)x`51W#6rJ5!O6Ba>1qF1L<-`-D% zsPH`9(D5|ch6LqE3>sNmx6e1JlaC2|bJuwsmWib18;fn8Cp{gK&W!AC7H!W4A(L(l z^nCO85jANiNmySm;JB38TKrjMJaGNfq-NH#n~#Qmg1QEpAQ0x3p4R%)Egdy+X}0qe9v* zinuI9H4MVfZpQ~?l$hm(N3Cr_$K-J$yw}V3E!VGjuX(F`Hb%a#uf$T&o3y!E59RQL z?akWFV(GJ+U^zG0$$d)ODHJy*?u!(smS_LPd7ddT=<+nyA8OwFVD%*0;;H&$Y~x+n zvkvKY$hbxa4Pe;h$`u;rchC$VJ3_??h`sWES0PGE9 z9QGrgs{BCw?<(___4m!NM}sQRMTQ#?^2X)i#;m*Hsl=a`LZ43%b+ttsYSKnUAveFp z7TT3r6K@0e{G@-hYD3vLHWs_@d8i?=8PCffK6gmsX>3ARc(6-6xo)%94Yp~s9_!Q? z%!~C_O$q44)nKIC;5k@slIhpe5&Ou~eNe#pPw>eY+(u$`kDMe?$v($`fI!Cf-!}px z{a_PeCzbaqZ{Az89D{ev3e`FasvMP2!_1`n2Bqx=P+Vftuv}LXl7B@weF^&(KH&ap zORFj?M7WSqM(vMdTC1-(a;$4Py#nm&o8ClR-FAId;^+`MZ_j9}pi#Z!BrbU?Hua|j z6D{Upl&4lu0n_jBdcms5G;WqS6+_HP3WA5BmjdwTiI4n_%s;d_m>_Z}E;;zz0Wvnzpty*@JYgtNc<6fP|ZOj!1%pMaY zRu)WXp{>+nK8RBS!-|U`pM653cpt4=7x-+EGPShUtIKCgpML)}*HlYK%OjtR(M#{- zSBOKb58AWxWO()tN+WkhJw0)iTq=8zd304`!QnO+`nA}ZWG=aBe)#63kxJUNzgZ^? zHK4LAOUPf32dqcgs!KN(QkHC97hU}QtMG&N13}#qr<8VeD!eUgG=x3`3D4y#My9M@ zKI_0>SBLIXaio%8A3LB z2Yb}MAo$X>sU1KM_<7p&T@a!6tSf=f&_f92pYkf}0qS-2at7__L*)N zy4~VJZ(lM2vsj>Ea=DokR@%e%?Y)cz7Z)x14i(V_qDMaHY2X|?DN*rwGK>6dkzOcm z2xB47uWyx#GFt@ICopi_f1YO#W!-}}KvCn}dQi&1E^~Ak0zvF@GoaS zHT!R4AY-2u;@mvqg52(WWOmlkZt^~=cT!pwG;+k#TIQD2e1&5WJb^J3zGW~OjNqCq~a^yaW0c=d(Lb1%+@grA6x zbe`c*_50s@Qm*&^hP_+2YNOiVreW8MOCb4oy`8JdSmD5oo0wCyX+bOOlhPHm)w*Sw z*Vgdn@=I$ZXbA?mHnWHXu`ge;vFEI*b|4-se5HCLv-3~Kbg>n{aH^*-)9tyuTBXO<}|Sl2hkTR``*%lcm9;97vEEx9|zWO3jm1?$b@`2@K3y_ ztv5;qP2Jv-8gj9Rex|wzt`0QDUh$-oj(eXvrM#9|^UBb%Em(8;&00M_Zf`aPBEF7F z&8@{Zz`l9#K?eh(e>etydY{*ENTj-aB1h-S_X>x)D32Ryn22sfSNPn9mKKdeQHUh4 zEPlhakZQ}(;0XKJWbA!qUX)K1##3os2z=}stL%ZzSL3bTqXa2Xs_U>o$b8*m?EZ@w z^Fu?~Q<^%Z7;8GH0)!j6yw91&zKYR~AwQ~`?^)ve_xQ~+DGqoj$Bj^>qzPGNBC7G9 z%z5`ra?w}DRl+#u>UMPg-}W*gW-+W&)~)-Vf<>X(ge!~->su=V0^onXOEBh315k`TkE}F^S#0-<5P+Js?7*!BHWaoC)(@l zZ~t5%h>-N)cY5k>_`{BHp7-hmfu5kWurnBbE4asH7S8zlVT%eM7`4Y%axSRm3{E*m;~(rv;Cvp!c&w2e}^i)tu?QMEHEZK1sy;6lrPw zzGghJ>~4pq&n0z_y)req2d8WBk4gFn;RZQ4n5y*CTInHQ0#8Ee`I(I9sUy>w=(!d= z_mXE(cpy)vy)h=8DfssX1|PZ;%~QJzMHzq1h2&*j)Xy>RYZ3AqAN7XuLauI%gSY3c zJMdK`)J^ARpUYf$wX~+Q5b1G1sC0rhs2*O&GX`{SAXy&n@y4h($6T7TSC&vv^D7F# z_gPLfrDG=PiIFN*@&i!5!TX*8i7+#8g?Aty<21%Naq}iTIt6)tmMRPJwFk*-rYtN zMGkeJQZf%AP;S$KZ9ZV` zT?+>99}%;-4&Lc~dVTBk0W(@&fY6Z!ronLS8Ko}^Ov^3^^(SSt+?&U{S#1xXXWG#| z@|x{oFM35l4c3^G<>|hEM@XrP8d$d)@&9cyn)5i}!rj7&h84cB+$tr80%q2)L$*sx z|MQx0Yo3#{;3?y90ScQab~hv-M2Xq{O~;e>RxKTrSLsWqFrgbTkzW(mbxuGZ0_NRW zBvvUXSUYO7S+9B=xe1!o|oI{iNl)1tH?4%^QfQqxne%X{8laIldklS;HOVADm zxV!&u@P~=1iZ!uNnh!y%U{n6OaK+kJ??$@UB7@;5r1z@9tk;%IAmsiI<)%SDSF1KeWH~l_Y zH#)}CK7o3;td@PBt`3Rc|IwBMzMJ2cI(_2i(a;flDwo)2SljYm#cTZ8Gxx`&dyoG$ zDVR3&W&|cVdu@D||6K89F$tSxsM`h#qNfNI9!(;!lx!Aot-%jbG)O%TrqYJj2P)G`jLmO4DI;DdK`e3e7oZN%P#Ou=!>5s=SsOqg$1+o))>$VXrZUhTp<<1~qgVU$z(hGR@- zWTA2HrKTZ@(u5u-BR>64t7g+eP!%+#R!DZDJC=+OnK;U7KgF7zy*3o25r^oNLvii! zQK_%k+o}KMQv3JOGt^DXGCiYjpk(-t*GvbuGeEZZ6b> z2PF81{#;z#cUK0b(+zA4>nKpDX%UH+2?52c7{WHH@xv@tCsadqBkxB>#I( zD+bUy(3Jz0l?{%8hhQx%SWt7BD7`U+VGfg9inPoRl4fR5`EWF|tYH|$!@5C`hjl5Z zfEsY62;`JDKSNC0D53@|@h2;f3aQUhiur&h1C5bmmx0~!*S=CV4|XmG;bMTp&~@=8 z*MElw(n!Z=4U)hsG)vP^$Dq4xucmnSoUU|4Xr`{@FXDPr-33ieVA8|TYGC*-RRHj3 z@wKc`B*p9Ic^a^dLSV%cUCy4xy5kvi<54oRu+XYkek^Rf=hqh(_-90bg7<$2FV+oF z#5wnzA_2SB^c@eMLG30!N)3^ZL14{6WiuojuaP+dLs0bivO>a#}lPF ztaUmC$-m!u3mzw%KAFn<(>|Phm!$PE`Y(rw3Pc0`zTcwS8x*?7ZV1U+_UmaVe}zk( zJa}_eW200Xr>x5KJg(bmRMr}ymLo(1ueH$M<+Y`=s$Nhri7(be2@_XcubDt*HADo zzJN^GU8=fQ*t$YYp40i(iD7V_2Oq1}xcX6n1n%ZKj*9&`o))wv3=sN9g_+3f0?egLtF+Z^{~qu3c#Eh>~*heX1nikFMm^gfSrIS7d@OK zPI!0&0)yC|MHvSW55J$q?VdDIAxZgNLCa(KZwE&T)g_{-WL*C`mhFKR-@Z*$0e0qk zX)HJ8zYW0Fdb<{^jbY^cdil$fH9F4~(9lB!^CR(5NK23bvzP~QhTjKGp0U|_G-uSf z>aSAgw(kjtAd&)4;fwpu2`g8pjT*BvHF&AkFf*Q9igd(Rci_pc=eN&bp^QzT0 zn$2hTqzfXau?WVEj1Zr0cm)dWKm=26uN|#Rb3e8+Jor6R*=#zz6^dW8R1rgc|A*pp zdwVR;Yg5RJauL955>T9!2;ZOdtQdCJyMTuKtFWf%=)BkvK(f;!5M?rK`d_q+^cw8; zTx0eRuASZoDX6)g`o_w<9&?{Zu1y0D*ooLFhUHm2SUc@VDf zMglIMa`S1Z1ys&(v58ndi5~e{3_$*53B##Ywlg_c=`L-xbas3aAGEyueGtjDAUE<* zf}R?lN_Wl}Th!6e?J0C$^7K5&z(>>2R?$b+@&&Dn|F`28HzjL-4Q zNc3ye8vlG?NsH>Rf=~qv4Kq+ zgXr1Gy5v8GpcX7299&M8zpTlb+nYOx^`7LYznb-eHR!r*FEt4|O2L=^95eG77Uc3^ zcjA_ToT{2(&q0Jbmi6_8xv27Hj@kb9nXe&%7HwL>EY~7@A~uIQB$1CwlDo4jTgJ7d z5RCKo?1{5+#!V*95n$cM$7jOY)f79JB>nVlLVN^!%!voYrFR2g7UX1iD8QwhF~y=E zK4b>k`XSW{1O%lXmN7otVV0NWtMBz|s{!9&BspxI+2QIn2I0#d-|D=p`x78Or-#8t zX;V%v>LoQXk~;*MAklR+gFh*Or1brJBCJ~-sxXC}M`|z2qk)qPAbOf3J4sdZyL(2u zfBRoeG$&>eu6EzsO#@~|#{>ZA0RkBx7!A0PPLZf1IQ8lOt5cBw61%7}$)zv}Zcw5v z91(U)!YuP1JT-IlD)#oD_uG4Jigl+unh=f^guy%GM;>=fi@q_qLf%gW{|TCi_P^O* z-;*w)bee$6bOu273(m@Xg&m~TfRLxQ` zq+FB$>Rlg*rD=q@O4owa5Jm$fG>(q$KZXG>x%9F1_)(~npmqy2Ts!ZD!QR)|#1*Vj z`^v~zMt27Py+KLq-xaLIT(xDRLP=v;2`a#uTdMNWeDA^lGO8(qmpES8POj|e=~!*SGEK#;XNO1AV(co2P;I+(G3mZ*`J^9I@n{M0m zNzlu{AX}1{3S$FY65=K8|5lYOn6NTh=w)Bj2|^|(=1PS@?)u8SNI&xAd8vNG?WP6q z%zlfJ2MxV#pn~@4Rw=&l0BUvm*}y1Upw!tdCOp{TElhj>>6x-iwCGnpFPM{TFDaQh z9Y)~8M=U92P6ydA{_ritYIK}=t~0`v=6My@L!enBZ(=|zNvxF zTI}|(9L&;mV<{;EKx;o^hb$j)5&se|om#q@_lP3{{CJ4lJ2py|lE$ivbnCO=Vjl2# z`nPe`_)k2hEDl$6U-yWied*vt<0nO+!)n5I?7J=z$rI+S<1RQoXcq1raQ*Z>5ZC3^ zA?HiL>LU~`F(C)Ia@`D!@{EA94r(qA)>Qxj6u#V_xA5;H#dNRl&%Ts`KT;y1bS4)O zv^Y)R5fZq?5J4I#zLPV3msa_5BnqX2-gS{lt|yes@=#YZzH@X&{G@UOE?qffn-)m` zUGO(0>no&A)}xWbhLd07qfg2C&H6VR*lBpW9R4P)R^P#VKT17*fhgw2{KW}5ZcNmoEFF`|=lAjbWwKQ@hE582z<~a_3nZKkDhd+k3;zH>Jt6zv3+>a#E zy>NOej+S8~0}g!;&x||7AyN-oq|tLndNJ&Hkb{fYEc!1Vv`Yokg9-Qx)CkhMR4Y^g zUR1&OkeahVe1fx)h#$UR(Yb8CPla!&L}*ni56jd`(Cz+tz$~d(n2dO-Ei3ioAll6h zFaO@d$w_~Z4KS{PJiukZn1uK{^nLY@;l9v|vKBtzdwM`XM!M~<$O^qST%im%?HAB1 zrxVz{1pQJz)siQkd;iBj$WTTDDKr6dCF!LQJWpoP|H(==Yltjv&}oPVh9AHahGaXz zR_UM}X*L@w8DTKDZGHeB4^oWmnvHSe%jS23FI$A`E@^8wqYB5;Vg>ITh+cT!XEY)9 z9rl-?9}2G8AO%-wqtc$-ej$Vd2h1;;bt?5iZ%B1ftK z`S9L%XzQy1Nd+fGPIydhafS5b>2|l`EW5v@f9ET%OJ0$q=3vt00ne=msKNcM5S634 z2XQGF{)?0U^X2SB^01aKG4wN=?%O?ZJPfkJe~5{g%7oLU(OgzpqX-nYp=W|lH>5nb zC$a5rsatkW6}5)1$6T{<2&%&u-3?feiPQCX)qN6q^&->EsN@(L^_>jdUw(9`Pyw#o zv>`~sajy!&#eqS{WA`Ya)qy7gRUwMNO|1?((Mi&wC&@W2 zf>c{uJLZAo2P|-0VQTqq%fvb~vK{8K<42zAeHnBVu(n5V^8ZIpo)IepXAe#fNs1BR OKP5Re*(zz%;Qs*%;cY(v literal 28811 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 Wp-cxE9q>m65k5$Nl&X|44*DOyK;9hy -- GitLab