synapse 2.177.0__py311-none-any.whl → 2.178.0__py311-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of synapse might be problematic. Click here for more details.

Files changed (44) hide show
  1. synapse/cortex.py +8 -4
  2. synapse/lib/aha.py +361 -88
  3. synapse/lib/base.py +27 -9
  4. synapse/lib/cell.py +167 -110
  5. synapse/lib/config.py +15 -11
  6. synapse/lib/coro.py +13 -0
  7. synapse/lib/layer.py +0 -5
  8. synapse/lib/link.py +1 -1
  9. synapse/lib/lmdbslab.py +3 -3
  10. synapse/lib/nexus.py +24 -12
  11. synapse/lib/stormlib/imap.py +6 -2
  12. synapse/lib/stormlib/smtp.py +12 -2
  13. synapse/lib/version.py +2 -2
  14. synapse/telepath.py +32 -17
  15. synapse/tests/files/aha/certs/cas/synapse.crt +28 -0
  16. synapse/tests/files/aha/certs/cas/synapse.key +51 -0
  17. synapse/tests/files/aha/certs/hosts/00.aha.loop.vertex.link.crt +30 -0
  18. synapse/tests/files/aha/certs/hosts/00.aha.loop.vertex.link.key +51 -0
  19. synapse/tests/files/aha/certs/users/root@synapse.crt +29 -0
  20. synapse/tests/files/aha/certs/users/root@synapse.key +51 -0
  21. synapse/tests/files/rstorm/testsvc.py +1 -1
  22. synapse/tests/test_axon.py +1 -1
  23. synapse/tests/test_cortex.py +22 -59
  24. synapse/tests/test_lib_agenda.py +3 -3
  25. synapse/tests/test_lib_aha.py +336 -490
  26. synapse/tests/test_lib_base.py +20 -0
  27. synapse/tests/test_lib_cell.py +49 -22
  28. synapse/tests/test_lib_config.py +4 -3
  29. synapse/tests/test_lib_nexus.py +8 -0
  30. synapse/tests/test_lib_stormlib_aha.py +35 -35
  31. synapse/tests/test_lib_stormlib_cell.py +4 -15
  32. synapse/tests/test_lib_stormlib_imap.py +14 -3
  33. synapse/tests/test_lib_stormlib_smtp.py +51 -0
  34. synapse/tests/test_tools_aha.py +78 -101
  35. synapse/tests/utils.py +86 -120
  36. synapse/tools/aha/clone.py +50 -0
  37. synapse/tools/aha/enroll.py +2 -1
  38. synapse/tools/backup.py +2 -2
  39. synapse/tools/changelog.py +3 -1
  40. {synapse-2.177.0.dist-info → synapse-2.178.0.dist-info}/METADATA +48 -48
  41. {synapse-2.177.0.dist-info → synapse-2.178.0.dist-info}/RECORD +44 -37
  42. {synapse-2.177.0.dist-info → synapse-2.178.0.dist-info}/LICENSE +0 -0
  43. {synapse-2.177.0.dist-info → synapse-2.178.0.dist-info}/WHEEL +0 -0
  44. {synapse-2.177.0.dist-info → synapse-2.178.0.dist-info}/top_level.txt +0 -0
synapse/lib/config.py CHANGED
@@ -392,10 +392,16 @@ class Config(c_abc.MutableMapping):
392
392
  else:
393
393
  return
394
394
 
395
- def reqConfValu(self, key):
395
+ def reqConfValu(self, key): # pragma: no cover
396
396
  '''
397
- Get a configuration value. If that value is not present in the schema
398
- or is not set, then raise an exception.
397
+ Deprecated. Use ``req(key)`` API instead.
398
+ '''
399
+ s_common.deprecated('Config.reqConfValu(), use req() instead.')
400
+ return self.req(key)
401
+
402
+ def req(self, key):
403
+ '''
404
+ Get a configuration value. If that value is not present in the schema or is not set, then raise an exception.
399
405
 
400
406
  Args:
401
407
  key (str): The key to require.
@@ -403,17 +409,15 @@ class Config(c_abc.MutableMapping):
403
409
  Returns:
404
410
  The requested value.
405
411
  '''
406
- # Ensure that the key is in self.json_schema
407
412
  if key not in self.json_schema.get('properties', {}):
408
- raise s_exc.BadArg(mesg='Required key is not present in the configuration schema.',
409
- key=key)
413
+ raise s_exc.BadArg(mesg=f'The {key} configuration option is not present in the configuration schema.',
414
+ name=key)
410
415
 
411
- # Ensure that the key is present in self.conf
412
- if key not in self.conf:
413
- raise s_exc.NeedConfValu(mesg='Required key is not present in configuration data.',
414
- key=key)
416
+ valu = self.conf.get(key, s_common.novalu)
417
+ if valu is not s_common.novalu:
418
+ return valu
415
419
 
416
- return self.conf.get(key)
420
+ raise s_exc.NeedConfValu(mesg=f'The {key} configuration option is required.', name=key)
417
421
 
418
422
  def reqKeyValid(self, key, value):
419
423
  '''
synapse/lib/coro.py CHANGED
@@ -148,6 +148,19 @@ async def ornot(func, *args, **kwargs):
148
148
  return await retn
149
149
  return retn
150
150
 
151
+ bgtasks = set()
152
+ def create_task(coro):
153
+
154
+ task = asyncio.get_running_loop().create_task(coro)
155
+ bgtasks.add(task)
156
+
157
+ def done(t):
158
+ bgtasks.remove(t)
159
+
160
+ task.add_done_callback(done)
161
+
162
+ return task
163
+
151
164
  class GenrHelp:
152
165
 
153
166
  def __init__(self, genr):
synapse/lib/layer.py CHANGED
@@ -1431,9 +1431,6 @@ class Layer(s_nexus.Pusher):
1431
1431
  self.growsize = self.layrinfo.get('growsize')
1432
1432
  self.logedits = self.layrinfo.get('logedits')
1433
1433
 
1434
- self.mapasync = core.conf.get('layer:lmdb:map_async')
1435
- self.maxreplaylog = core.conf.get('layer:lmdb:max_replay_log')
1436
-
1437
1434
  # slim hooks to avoid async/fire
1438
1435
  self.nodeAddHook = None
1439
1436
  self.nodeDelHook = None
@@ -2728,8 +2725,6 @@ class Layer(s_nexus.Pusher):
2728
2725
  slabopts = {
2729
2726
  'readahead': True,
2730
2727
  'lockmemory': self.lockmemory,
2731
- 'map_async': self.mapasync,
2732
- 'max_replay_log': self.maxreplaylog,
2733
2728
  }
2734
2729
 
2735
2730
  if self.growsize is not None:
synapse/lib/link.py CHANGED
@@ -164,7 +164,7 @@ class Link(s_base.Base):
164
164
  self.reader._transport.abort()
165
165
  try:
166
166
  await self.writer.wait_closed()
167
- except (BrokenPipeError, ConnectionResetError) as e:
167
+ except Exception as e:
168
168
  logger.debug('Link error waiting on close: %s', str(e))
169
169
 
170
170
  self.onfini(fini)
synapse/lib/lmdbslab.py CHANGED
@@ -838,7 +838,7 @@ class Slab(s_base.Base):
838
838
  'recovering': slab.recovering,
839
839
  'maxsize': slab.maxsize,
840
840
  'growsize': slab.growsize,
841
- 'mapasync': slab.mapasync,
841
+ 'mapasync': True,
842
842
 
843
843
  })
844
844
  return retn
@@ -851,6 +851,8 @@ class Slab(s_base.Base):
851
851
  kwargs.setdefault('lockmemory', False)
852
852
  kwargs.setdefault('map_async', True)
853
853
 
854
+ assert kwargs.get('map_async')
855
+
854
856
  opts = kwargs
855
857
 
856
858
  self.path = path
@@ -895,8 +897,6 @@ class Slab(s_base.Base):
895
897
  logger.info(f'SYN_LOCKMEM_DISABLE envar set, skipping lockmem for {self.path}')
896
898
  self.lockmemory = False
897
899
 
898
- self.mapasync = opts.setdefault('map_async', True)
899
-
900
900
  self.mapsize = _mapsizeround(mapsize)
901
901
  if self.maxsize is not None:
902
902
  self.mapsize = min(self.mapsize, self.maxsize)
synapse/lib/nexus.py CHANGED
@@ -91,7 +91,6 @@ class NexsRoot(s_base.Base):
91
91
  self.writeholds = set()
92
92
 
93
93
  self.applytask = None
94
- self.applylock = asyncio.Lock()
95
94
 
96
95
  self.ready = asyncio.Event()
97
96
  self.donexslog = self.cell.conf.get('nexslog:en')
@@ -110,9 +109,7 @@ class NexsRoot(s_base.Base):
110
109
 
111
110
  logpath = s_common.genpath(self.dirn, 'slabs', 'nexuslog')
112
111
 
113
- self.map_async = self.cell.conf.get('nexslog:async')
114
- self.nexsslab = await s_lmdbslab.Slab.anit(path, map_async=self.map_async)
115
- self.nexsslab.addResizeCallback(cell.checkFreeSpace)
112
+ self.nexsslab = await cell._initSlabFile(path)
116
113
 
117
114
  self.nexshot = await self.nexsslab.getHotCount('nexs:indx')
118
115
 
@@ -126,8 +123,7 @@ class NexsRoot(s_base.Base):
126
123
  elif vers != 2:
127
124
  raise s_exc.BadStorageVersion(mesg=f'Got nexus log version {vers}. Expected 2. Accidental downgrade?')
128
125
 
129
- slabopts = {'map_async': self.map_async}
130
- self.nexslog = await s_multislabseqn.MultiSlabSeqn.anit(logpath, slabopts=slabopts, cell=cell)
126
+ self.nexslog = await s_multislabseqn.MultiSlabSeqn.anit(logpath, cell=cell)
131
127
 
132
128
  # just in case were previously configured differently
133
129
  logindx = self.nexslog.index()
@@ -147,6 +143,9 @@ class NexsRoot(s_base.Base):
147
143
 
148
144
  self.onfini(fini)
149
145
 
146
+ def getNexsKids(self):
147
+ return list(self._nexskids.values())
148
+
150
149
  async def _migrateV1toV2(self, nexspath, logpath):
151
150
  '''
152
151
  Close the slab, move it to the new multislab location, then copy out the nexshot
@@ -195,8 +194,7 @@ class NexsRoot(s_base.Base):
195
194
 
196
195
  # Open a fresh slab where the old one used to be
197
196
  logger.warning(f'Re-opening fresh nexslog slab at {nexspath} for nexshot')
198
- self.nexsslab = await s_lmdbslab.Slab.anit(nexspath, map_async=self.map_async)
199
- self.nexsslab.addResizeCallback(self.cell.checkFreeSpace)
197
+ self.nexsslab = await self.cell._initSlabFile(nexspath)
200
198
 
201
199
  self.nexshot = await self.nexsslab.getHotCount('nexs:indx')
202
200
 
@@ -230,7 +228,7 @@ class NexsRoot(s_base.Base):
230
228
 
231
229
  async def enNexsLog(self):
232
230
 
233
- async with self.applylock:
231
+ async with self.cell.nexslock:
234
232
 
235
233
  if self.donexslog:
236
234
  return
@@ -309,7 +307,6 @@ class NexsRoot(s_base.Base):
309
307
  If I'm not a follower, mutate, otherwise, ask the leader to make the change and wait for the follower loop
310
308
  to hand me the result through a future.
311
309
  '''
312
-
313
310
  # pick up a reference to avoid race when we eventually can promote
314
311
  client = self.client
315
312
 
@@ -344,7 +341,7 @@ class NexsRoot(s_base.Base):
344
341
  if meta is None:
345
342
  meta = {}
346
343
 
347
- async with self.applylock:
344
+ async with self.cell.nexslock:
348
345
  self.reqNotReadOnly()
349
346
  # Keep a reference to the shielded task to ensure it isn't GC'd
350
347
  self.applytask = asyncio.create_task(self._eat((nexsiden, event, args, kwargs, meta)))
@@ -577,6 +574,9 @@ class NexsRoot(s_base.Base):
577
574
  if respfutu is not None:
578
575
  respfutu.set_result(retn)
579
576
 
577
+ except s_exc.LinkShutDown:
578
+ logger.warning(f'mirror loop: leader closed the connection.')
579
+
580
580
  except Exception as exc: # pragma: no cover
581
581
  logger.exception(f'error in mirror loop: {exc}')
582
582
 
@@ -634,9 +634,21 @@ class Pusher(s_base.Base, metaclass=RegMethType):
634
634
  assert prev is not None, f'Failed removing {self.nexsiden}'
635
635
 
636
636
  self.onfini(onfini)
637
-
638
637
  self.nexsroot = nexsroot
639
638
 
639
+ async def modNexsRoot(self, ctor):
640
+
641
+ kids = [self]
642
+ if self.nexsroot is not None:
643
+ kids = self.nexsroot.getNexsKids()
644
+ await self.nexsroot.fini()
645
+
646
+ nexsroot = await ctor()
647
+
648
+ [kid.setNexsRoot(nexsroot) for kid in kids]
649
+
650
+ await nexsroot.startup()
651
+
640
652
  @classmethod
641
653
  def onPush(cls, event: str, passitem=False) -> Callable:
642
654
  '''
@@ -50,6 +50,8 @@ class ImapLib(s_stormtypes.Lib):
50
50
  'desc': 'The time to wait for all commands on the server to execute.'},
51
51
  {'type': 'bool', 'name': 'ssl', 'default': True,
52
52
  'desc': 'Use SSL to connect to the IMAP server.'},
53
+ {'type': 'bool', 'name': 'ssl_verify', 'default': True,
54
+ 'desc': 'Perform SSL/TLS verification.'},
53
55
  ),
54
56
  'returns': {
55
57
  'type': 'inet:imap:server',
@@ -69,17 +71,19 @@ class ImapLib(s_stormtypes.Lib):
69
71
  'connect': self.connect,
70
72
  }
71
73
 
72
- async def connect(self, host, port=993, timeout=30, ssl=True):
74
+ async def connect(self, host, port=993, timeout=30, ssl=True, ssl_verify=True):
73
75
 
74
76
  self.runt.confirm(('storm', 'inet', 'imap', 'connect'))
75
77
 
76
78
  ssl = await s_stormtypes.tobool(ssl)
77
79
  host = await s_stormtypes.tostr(host)
78
80
  port = await s_stormtypes.toint(port)
81
+ ssl_verify = await s_stormtypes.tobool(ssl_verify)
79
82
  timeout = await s_stormtypes.toint(timeout, noneok=True)
80
83
 
81
84
  if ssl:
82
- imap_cli = aioimaplib.IMAP4_SSL(host=host, port=port, timeout=timeout)
85
+ ctx = self.runt.snap.core.getCachedSslCtx(opts=None, verify=ssl_verify)
86
+ imap_cli = aioimaplib.IMAP4_SSL(host=host, port=port, timeout=timeout, ssl_context=ctx)
83
87
  else:
84
88
  imap_cli = aioimaplib.IMAP4(host=host, port=port, timeout=timeout)
85
89
 
@@ -96,6 +96,8 @@ class SmtpMessage(s_stormtypes.StormType):
96
96
  'desc': 'Use the STARTTLS directive with the SMTP server.'},
97
97
  {'name': 'timeout', 'type': 'int', 'default': 60,
98
98
  'desc': 'The timeout (in seconds) to wait for message delivery.'},
99
+ {'type': 'bool', 'name': 'ssl_verify', 'default': True,
100
+ 'desc': 'Perform SSL/TLS verification.'},
99
101
  ),
100
102
  'returns': {'type': 'list', 'desc': 'An ($ok, $valu) tuple.'}}},
101
103
 
@@ -148,7 +150,8 @@ class SmtpMessage(s_stormtypes.StormType):
148
150
  async def _getEmailHtml(self):
149
151
  return self.bodyhtml
150
152
 
151
- async def send(self, host, port=25, user=None, passwd=None, usetls=False, starttls=False, timeout=60):
153
+ async def send(self, host, port=25, user=None, passwd=None, usetls=False, starttls=False, timeout=60,
154
+ ssl_verify=True):
152
155
 
153
156
  self.runt.confirm(('storm', 'inet', 'smtp', 'send'))
154
157
 
@@ -161,6 +164,7 @@ class SmtpMessage(s_stormtypes.StormType):
161
164
  port = await s_stormtypes.toint(port)
162
165
  usetls = await s_stormtypes.tobool(usetls)
163
166
  starttls = await s_stormtypes.tobool(starttls)
167
+ ssl_verify = await s_stormtypes.tobool(ssl_verify)
164
168
 
165
169
  if usetls and starttls:
166
170
  raise s_exc.BadArg(mesg='usetls and starttls are mutually exclusive arguments.')
@@ -183,6 +187,10 @@ class SmtpMessage(s_stormtypes.StormType):
183
187
 
184
188
  recipients = [await s_stormtypes.tostr(e) for e in self.recipients]
185
189
 
190
+ ctx = None
191
+ if usetls or starttls:
192
+ ctx = self.runt.snap.core.getCachedSslCtx(opts=None, verify=ssl_verify)
193
+
186
194
  futu = aiosmtplib.send(message,
187
195
  port=port,
188
196
  hostname=host,
@@ -191,7 +199,9 @@ class SmtpMessage(s_stormtypes.StormType):
191
199
  use_tls=usetls,
192
200
  start_tls=starttls,
193
201
  username=user,
194
- password=passwd)
202
+ password=passwd,
203
+ tls_context=ctx,
204
+ )
195
205
 
196
206
  await s_common.wait_for(futu, timeout=timeout)
197
207
 
synapse/lib/version.py CHANGED
@@ -223,6 +223,6 @@ def reqVersion(valu, reqver,
223
223
  ##############################################################################
224
224
  # The following are touched during the release process by bumpversion.
225
225
  # Do not modify these directly.
226
- version = (2, 177, 0)
226
+ version = (2, 178, 0)
227
227
  verstring = '.'.join([str(x) for x in version])
228
- commit = 'b7da795aeb690020e38e99dc5aa1f505cdc2d659'
228
+ commit = '56bad29e241893b702ea437d500a0229e8e1956b'
synapse/telepath.py CHANGED
@@ -997,12 +997,6 @@ class ClientV2(s_base.Base):
997
997
 
998
998
  await s_base.Base.__anit__(self)
999
999
 
1000
- # some ugly stuff in order to be backward compatible...
1001
- if not isinstance(urlinfo, (list, tuple)):
1002
- urlinfo = (urlinfo,)
1003
-
1004
- urlinfo = [chopurl(u) for u in urlinfo]
1005
-
1006
1000
  self.aha = None
1007
1001
 
1008
1002
  self.clients = {}
@@ -1012,9 +1006,9 @@ class ClientV2(s_base.Base):
1012
1006
 
1013
1007
  self.onlink = onlink
1014
1008
 
1015
- self.booturls = urlinfo
1016
1009
  self.bootdeque = collections.deque()
1017
- self.bootdeque.extend(self.booturls)
1010
+
1011
+ self.setBootUrls(urlinfo)
1018
1012
 
1019
1013
  self.ready = asyncio.Event()
1020
1014
  self.deque = collections.deque()
@@ -1033,6 +1027,16 @@ class ClientV2(s_base.Base):
1033
1027
 
1034
1028
  self.schedCoro(self._initBootProxy())
1035
1029
 
1030
+ def setBootUrls(self, urlinfo):
1031
+
1032
+ if not isinstance(urlinfo, (list, tuple)):
1033
+ urlinfo = (urlinfo,)
1034
+
1035
+ self.booturls = [chopurl(u) for u in urlinfo]
1036
+
1037
+ self.bootdeque.clear()
1038
+ self.bootdeque.extend(self.booturls)
1039
+
1036
1040
  def getNextBootUrl(self):
1037
1041
  if not self.bootdeque:
1038
1042
  self.bootdeque.extend(self.booturls)
@@ -1063,13 +1067,14 @@ class ClientV2(s_base.Base):
1063
1067
 
1064
1068
  # regular telepath client behavior
1065
1069
  proxy = await openinfo(urlinfo)
1066
- await self._onPoolLink(proxy, urlinfo)
1067
1070
 
1068
1071
  async def reconnect():
1069
1072
  if not self.isfini:
1070
1073
  self.schedCoro(self._initBootProxy())
1071
1074
 
1072
1075
  proxy.onfini(reconnect)
1076
+
1077
+ await self._onPoolLink(proxy, urlinfo)
1073
1078
  return
1074
1079
 
1075
1080
  except Exception as e:
@@ -1210,20 +1215,16 @@ class Client(s_base.Base):
1210
1215
 
1211
1216
  await s_base.Base.__anit__(self)
1212
1217
 
1213
- if isinstance(urlinfo, (str, dict)):
1214
- urlinfo = (urlinfo,)
1215
-
1216
- urlinfo = [chopurl(u) for u in urlinfo]
1217
-
1218
1218
  if conf is None:
1219
1219
  conf = {}
1220
1220
 
1221
1221
  if opts is None:
1222
1222
  opts = {}
1223
1223
 
1224
- self._t_urlinfo = urlinfo
1225
1224
  self._t_urldeque = collections.deque()
1226
1225
 
1226
+ self.setBootUrls(urlinfo)
1227
+
1227
1228
  self._t_opts = opts
1228
1229
  self._t_conf = conf
1229
1230
 
@@ -1247,6 +1248,16 @@ class Client(s_base.Base):
1247
1248
 
1248
1249
  await self._fireLinkLoop()
1249
1250
 
1251
+ def setBootUrls(self, urlinfo):
1252
+
1253
+ if not isinstance(urlinfo, (list, tuple)):
1254
+ urlinfo = (urlinfo,)
1255
+
1256
+ self._t_urlinfo = [chopurl(u) for u in urlinfo]
1257
+
1258
+ self._t_urldeque.clear()
1259
+ self._t_urldeque.extend(self._t_urlinfo)
1260
+
1250
1261
  def _getNextUrl(self):
1251
1262
  if not self._t_urldeque:
1252
1263
  self._t_urldeque.extend(self._t_urlinfo)
@@ -1263,6 +1274,7 @@ class Client(s_base.Base):
1263
1274
  async def _fireLinkLoop(self):
1264
1275
  self._t_proxy = None
1265
1276
  self._t_ready.clear()
1277
+ await self.fire('tele:client:linkloop')
1266
1278
  self.schedCoro(self._teleLinkLoop())
1267
1279
 
1268
1280
  async def _teleLinkLoop(self):
@@ -1281,7 +1293,7 @@ class Client(s_base.Base):
1281
1293
  now = time.monotonic()
1282
1294
  if now > lastlog + 60.0: # don't logspam the disconnect message more than 1/min
1283
1295
  url = s_urlhelp.sanitizeUrl(zipurl(urlinfo))
1284
- logger.exception(f'telepath client ({url}) encountered an error: {e}')
1296
+ logger.warning(f'telepath client ({url}) encountered an error: {e}', exc_info=e)
1285
1297
  lastlog = now
1286
1298
  await self.waitfini(timeout=self._t_conf.get('retrysleep', 0.2))
1287
1299
 
@@ -1543,7 +1555,7 @@ async def openinfo(info):
1543
1555
  path, name = path.split(':')
1544
1556
  link = await s_link.unixconnect(path)
1545
1557
 
1546
- else:
1558
+ elif scheme in ('tcp', 'ssl'):
1547
1559
 
1548
1560
  path = info.get('path')
1549
1561
  name = info.get('name', path[1:])
@@ -1592,6 +1604,9 @@ async def openinfo(info):
1592
1604
 
1593
1605
  link = await s_link.connect(host, port, linkinfo=linkinfo)
1594
1606
 
1607
+ else:
1608
+ raise s_exc.BadUrl(mesg=f'Invalid URL scheme: {scheme}')
1609
+
1595
1610
  prox = await Proxy.anit(link, name)
1596
1611
  prox.onfini(link)
1597
1612
 
@@ -0,0 +1,28 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIEvzCCAqegAwIBAgIRAIdu+9lQ3Z2nydXmG1/p2BAwDQYJKoZIhvcNAQELBQAw
3
+ EjEQMA4GA1UEAwwHc3luYXBzZTAeFw0yNDA3MDgxMzAxNDBaFw0zNDA3MDYxMzAx
4
+ NDBaMBIxEDAOBgNVBAMMB3N5bmFwc2UwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
5
+ ggIKAoICAQDQ8AFyEbiRUsKdRFlm6WS5X2cp9339H3A0qsXLSRYsCZGc6oJtLX0/
6
+ 52xPGCrKlXde2jxHU8DMDiEzQ3iVJjzDbJWXgAoNVfwrNVS1zjlSZyExVfRrCbzo
7
+ XpGeuNAIY/WCpsbSxM7mCVPuEZtbX2rY4XmdyBWUpd4dqoDDIK2wU329daJEVNpd
8
+ y9wdbZ2lLNPmKGS6Kb7Th3mio+sHpHEi6gcfYzH+mOFdWFVAh602OFMUp+fLq3nG
9
+ MyFHHLDC2vvPqVWf+T7Z1E8k85Zqw43TSUTwdlG6u8egC6soKQsEze6oi4fMAt0l
10
+ a4bgMMWDMIKJuQ4f6THEq5vKwPj0E78aT6C4C7qSKeHZSf8IOj7l3ukdgl7Sbrga
11
+ JCjpL1V5+EB8LTpxjjK+TDbXUwU/eKIJp/I2i7dd//nMRs9Wr2k6aIvAt9PbopA2
12
+ kG4tCS93TmzCza3TCtc4BruFHz92ToLfxvgcNq6N/BboDVjDIeAKtrWpe9VHPEIy
13
+ Eh23tAPcgPXmlOBZj4DKJ5YoGNbwYQaFDrLIHh1JzRGQbAh00JuaqDPH3kb1Q6sm
14
+ VjUx4QpX34qj231Bpfgu2eZX2kiLvtW+qPPfxWY2RCms1Yb+GMeKAE+9E8rak8Nq
15
+ oPvdqgdUUbneW1PRgBaalu7xDALH/DQm5R+baly5PEYi8gk/vsyaQwIDAQABoxAw
16
+ DjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4ICAQB4Asv4TuAgF2vcOdxl
17
+ mjPBwYueBDJrbbP2I6qjE9laO0xMyIN4Dp8ExbJyBKl/RlkSA/1cvJ7EyhlJnY1S
18
+ Dps8EgKS5lQw0D/bFg8JQNgNec6jCxjfytRgYkhoikabz8HR2gmUIb0On6X+dvht
19
+ L3Hv1/41Q4+Tig1JPRxP6C/hHcfLnCvmIsrMgKRbTGzb1AKfP8N93eZqDcA0nZo5
20
+ Q0p+AdLQ6ilnh8895wQexoKs7mWImEzxUdTMZlf/YSQ9Nct3OKxtYg0IOk1KW9Fe
21
+ sMstTDHg+/NJr2297vCmeNydYRGOTidLefebaNq0YnTm9cI3kPi/9etfUGeWHbrW
22
+ aXXJCQ02uiWjrL9ykiifB6f0nve0m4ENWI11FypZ3nReMNDFIYSQfwlat6E/KTQ/
23
+ 5ih/NEgbY5KnMcUJqEKCBftfvfZyueE0frHClLZNi+YQNXD3ui6lmXzn8vmvaHeR
24
+ dDfCifQ5TGHOlNmk9LMOv1Szx9CNswUwKDpSLklFp2lzI0JHTXm+NYCqeE+3cnrN
25
+ vbsq55txmImj/Ekos5/kuv3Z2myJsDd2xT2eZ/QEkb7FOeO5RPrya3yXoSGNlkgs
26
+ XG8vvCDNTeD6BJPWHjbu0ksZ6nxBFRsEmA2Ni8Y9ROUXUuJtwX+sYqHfAAVMLbiR
27
+ wSujqDSopMoJSGr0hUT9kjbUSg==
28
+ -----END CERTIFICATE-----
@@ -0,0 +1,51 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIIJKAIBAAKCAgEA0PABchG4kVLCnURZZulkuV9nKfd9/R9wNKrFy0kWLAmRnOqC
3
+ bS19P+dsTxgqypV3Xto8R1PAzA4hM0N4lSY8w2yVl4AKDVX8KzVUtc45UmchMVX0
4
+ awm86F6RnrjQCGP1gqbG0sTO5glT7hGbW19q2OF5ncgVlKXeHaqAwyCtsFN9vXWi
5
+ RFTaXcvcHW2dpSzT5ihkuim+04d5oqPrB6RxIuoHH2Mx/pjhXVhVQIetNjhTFKfn
6
+ y6t5xjMhRxywwtr7z6lVn/k+2dRPJPOWasON00lE8HZRurvHoAurKCkLBM3uqIuH
7
+ zALdJWuG4DDFgzCCibkOH+kxxKubysD49BO/Gk+guAu6kinh2Un/CDo+5d7pHYJe
8
+ 0m64GiQo6S9VefhAfC06cY4yvkw211MFP3iiCafyNou3Xf/5zEbPVq9pOmiLwLfT
9
+ 26KQNpBuLQkvd05sws2t0wrXOAa7hR8/dk6C38b4HDaujfwW6A1YwyHgCra1qXvV
10
+ RzxCMhIdt7QD3ID15pTgWY+AyieWKBjW8GEGhQ6yyB4dSc0RkGwIdNCbmqgzx95G
11
+ 9UOrJlY1MeEKV9+Ko9t9QaX4LtnmV9pIi77Vvqjz38VmNkQprNWG/hjHigBPvRPK
12
+ 2pPDaqD73aoHVFG53ltT0YAWmpbu8QwCx/w0JuUfm2pcuTxGIvIJP77MmkMCAwEA
13
+ AQKCAgAxPqgwkQGt6tIoy//AVDkjwdsoVodQ3hSNrURiNe8uYPD7iYBFKEgRhEOQ
14
+ XtNTHShd6FT1wMU7swbbNMdabAE9VD3rz8dOvlnpey/ki98Rz3HQ1X/+rHRkVkm/
15
+ HbMWjyzB5voMmktjh4ZLIcY6ooIl7PrDl/GSMAfqeRHRK8YUPZFw0qV0soUnP1G5
16
+ c+kIkci9wf5/rDAoXhFqpnTSP81Um9Ei8jfJ2JGhdRze0TufgGYAg9SLufZBIzLw
17
+ NlBpFMDuAGzIgC/ymmou/OSSdFXcmzPO8ywvNWwHCkkEdav9rWXXPs+6Y2BpHe9T
18
+ rtsWoRvbRw0Ps2BCCOp2vsXOjUrohP4I2iKb5ExHAQoKmewro2b/txJw39rnaWa5
19
+ /E9OG5hvbXEt0o5dfeLgtQLXcTsjTGqbOO3bi4dS42Zz9DdnnHf9oNes5odxW2lp
20
+ TCPJQozZuzY9J5toEltz2RBgX4ECWaXE1UnY6E4nm1zkDRc1xx7V1bXp6MsXWYx6
21
+ MO62tprWb+zFz7M6yIz7fsB9339X5Ky+xtDPKBJk8qnOVFpMbHkefpiHs6tPlmyu
22
+ 1wIjeL+3Om2pAd1nEPuk02pOhiurthiqI6wwHI8X03RnF5HU9tKUKLMCjnD1PJuM
23
+ Ysqj7pDdaezRic+mrQAyBqebLzEcZ+PRwOpPVCX3lo2G/BD1bQKCAQEA8u70QHiX
24
+ l/OlcxTG4nVn62ljsWCY3FYTyfDtWrP3uZQ7zaLF+wlGX7MXo416zVHPvW4YtCkG
25
+ 1n6KdaQguuSbE+CgvzyCmCLtSYiXuA35dVa9a6TDG5nPvwPJeT99HPMg1xRXxCaC
26
+ f8ilJ6WILD9sG6383a0fWC7ZlXpIFB+ZXmNaj82vS421BrbciH+sLO9jk94Drxnw
27
+ aXe81G6Rkabw3w852y+0TgqOoiVis4rCBpCL1e7Oz+s6+kmpNvc/4NI9LZTk2B/l
28
+ M++9aTi11p4Z/1paDffOPinmgKXOhb1fud6+j7XbNmvU+mgDc+95H93zA2rp37CT
29
+ CU9jo5i/hNUDFQKCAQEA3Czy3iKpvDKtsq9cDStfg1Ysr1raqOKHr4cS01M3u5Xa
30
+ Ku3ORGkiVcQJAfgWik5nFfbzbiX2SNUFB9jLQvIGnAxRTen6empfCCds9+HNS4PI
31
+ E8Byyepr9H6LFpqLr/GDrTA4cXWez8r4BMZwsuYa/cOEZt9Uoq97DFlCEwL4YDD2
32
+ ZDNLSLry7LhH4XN0oYU+7imj4fKebWDY2m/qc+OJ0+xMDg/dioFfWaIW5UnpteNY
33
+ 6YZFTOygosSRrvEKGKnaszVpDRLPcHKcEzIKX8Naf03898R1m+dM1Atc/UZa9pet
34
+ 6kpZpqpKoGHrXg7rNWWdPyJfm4bH1MoNqjABUIhd9wKCAQAV6xtcicTbr974oCJF
35
+ omQq6EpXYajJEHcenD8+FMjAFLDEn/AO80pHLihu2EABMGV26O0PrDfyuF4TuSg+
36
+ 1IttYrH+Lx51TYltPga6U4BzZs0WXjpATkNhL51I9EJ8jy8iWLKGfxb9IoRMLHI5
37
+ 08sUQEF1Wr5ePXPiObMxJZy32Gz+Vod/YJy5q1wAcMx/DWZFnB1m+gcn7Oa7n/JA
38
+ WviWl5AXx5kUBX3TAV6DZnyVDQug1LgSKF4c4PKEhBBeX3mnmCyBl3cdlX7YdIZr
39
+ g75CvMstQXN5RlyGtO8KQAjYA1HcM4NAyL/hi+rr1epuxp67azUIuqy5hVEvHIQD
40
+ Hxj1AoIBAQC8knrIKiP5neYKvgo29UjusaW/4i6YqrvPZ/6FpCZ9sRCT5+zbxrez
41
+ gRy95P9ZIWFE/KbtVfIj2t5eJB2ijqt+h0YzVwxCQEx4LVw0yd4MqSd5U0B9Exu2
42
+ 4ZK6n064OD+w2zXcZwLHsWzOmi736gCACy6g9PIGDAl1QBVJNygHKqg8lXoLJqLc
43
+ f9CAlWP02qxVSrCj2io6P9I689N3wg/Pw/g3qvrxn3BM0niNlMpoD/mcuHUuNxQ1
44
+ k+m6TZN6IC/BgSMiIVQtWNu3zQn5jtU5Z1Ab3NVl26p/iePwwIsz3CEGIvu5tOwJ
45
+ hRQTEO/+YbNV2VjNWZhY9VzSwB7AHKttAoIBADaDQIZC+2JcOAZnLCwfToYb0Ga4
46
+ Hs0NFcO8/EH7PNTTlhbD5bVPW/6IlTkSDemMp89zdYoB3EAfevWK5pMp5XOpQfsA
47
+ Puc2gueO/ICSb76YcabAdnOyB73Kb2PvqQ7yl6YP9U9IK3PBuZbDxiOcsM1h1yfL
48
+ XlMjDH08/e5efDBaxeVDTXS63haFXTgRKHYdnEm63AzeR0PXvpD/az++aaxoxkAV
49
+ SV/zudxSzx/O8zrVjl6lz1vb35jQ1s4X2T8EfGEjuXAGx7yV9MaEwLWH/RhHAUgD
50
+ vHoSEcB5Q3hbSj0QBqHiSkKcGn5VYP3kXSGMF2438flUahpdMpeP4QTa3tA=
51
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1,30 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIFJTCCAw2gAwIBAgIRANebBnGvTlRt7CIGrH6WJagwDQYJKoZIhvcNAQELBQAw
3
+ EjEQMA4GA1UEAwwHc3luYXBzZTAeFw0yNDA3MDgxMzAxNDFaFw0zNDA3MDYxMzAx
4
+ NDFaMCIxIDAeBgNVBAMMFzAwLmFoYS5sb29wLnZlcnRleC5saW5rMIICIjANBgkq
5
+ hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvXp4PAfmdzu5t6ADh/l3iVTRYbpPVnQz
6
+ 7bySmQlhTtNQFRDOHgEyfttpd0zTWoQZBiQr9H4ZjXE5W3XHdptHcPE718rzBcP3
7
+ G+DDIbp5nbkccUb7lvMVt39/4n9lK64K5YdnRop4SGsnps2WJvrLv/7qhgXPedjF
8
+ Yh/E7iR54C+wns4aKvD2gZV9vYudu6PcB3S/b/r0Vqykpsy6dFL1bKTvJCPyD4b3
9
+ ZAXpHr8Cws9Chae8DPt3PkUFCMnRl4opG7i8w/aJABRiXS9whccP1H0uGMvRF69P
10
+ E1eSjXytwFcBUOI3rTwnAWBOfQ1zwRAQ6nCQsjH/CKZffrKro6M7kT+rfE0EiDPG
11
+ kqf0owa+av4Rv2D0qRXhOBsq/jWgCtznk4286JweaRW8Omk+ViG5JO0Pxczp0bpg
12
+ qiExqpJ/O8HTAEKbI9MB2+qRcUVnJanJ2KXmPUWdTtJQuEtCoLfDExudzOJgMwb8
13
+ i2cmXTeVwas2QKA5pD+OOlGKciQc0T2xPIE/Gm/3CWRBs1wj9fqJ85NG9zbtCPpT
14
+ 7yuruYyiuRJTAo9s8D4AGaoeQLhQ8JE4Xkfol9Pva/UTIaHoKux6aHYsXBUbEeZb
15
+ RqO3BGViV86Po+1+t2lBHHfD/s/YTnT7cjm+dYQdS9GqrwzZr7lp538lFkmFeX7t
16
+ wTZakkXWIGMCAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgZAMAsGA1UdDwQEAwIF
17
+ oDATBgNVHSUEDDAKBggrBgEFBQcDATAJBgNVHRMEAjAAMCIGA1UdEQQbMBmCFzAw
18
+ LmFoYS5sb29wLnZlcnRleC5saW5rMA0GCSqGSIb3DQEBCwUAA4ICAQDFSKMqM/A9
19
+ maLx5zMO917Ysw1odf1DsemYeDjoZPRMSC/PVIjJnaZqB7UH3/mUxX0uqk9NMjLD
20
+ aq0u8vJqNnjxBzFWfcb5vcH05WC1lBIJj9Bd/tR+0jXL31COqZ5usljv/uL74hII
21
+ MH9qiRqDE7eQq7Mcxz6qbXwGGqY5570iOBfvLConR8zCy0WEuDf3yB8/8XKaDsxA
22
+ 6TiaY35OZgR6yNA7q+1rpBUGCsX14mJMOVWtIaY5V2F4RHc+7HzdkW0o8XDHk4lS
23
+ Tq/SAfjFsGt1bDLgmJ3HtI+lUBZtW+uKLZVHNnV4v7rAebu4TLUtbZXl7eeUBWpF
24
+ mSP2rIs0RbR7Y3jAXg4WMu4fIeZkP/jUvPpgUfkiF5jevwc0GvG7h8u+6ybg9nrS
25
+ 09vlTXc08CRgtp2eYTnsSR7aJCr0kYo7ZTWbeo96gf/vJIVJcNnRZnvvfl1vyrZT
26
+ QK13S6TzUbF1oAVHMH5nSun200D2CSzyjOYDnGpTGIdfbamI2KsphyUS/sVCETDP
27
+ f8fC01rRBpjFc7w+ubYuRyiXEJpzbRJe2CWQZPxq0CZ7Yifgz7hIot5/F1EuNE5z
28
+ elh6vtjcudEoQjOgUI4HABQe9nI6TUDfAKPlo/ffB4iHMBmC49WaCdu/6gQs0s7j
29
+ KjhaMLwW7zaGUYFkdR1vcn3qeFnAM9cmBQ==
30
+ -----END CERTIFICATE-----
@@ -0,0 +1,51 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ 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
51
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1,29 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIE9jCCAt6gAwIBAgIRAJGsran8ISfoaXuIMN7vAIAwDQYJKoZIhvcNAQELBQAw
3
+ EjEQMA4GA1UEAwwHc3luYXBzZTAeFw0yNDA3MDgxMzAxNDFaFw0zNDA3MDYxMzAx
4
+ NDFaMBcxFTATBgNVBAMMDHJvb3RAc3luYXBzZTCCAiIwDQYJKoZIhvcNAQEBBQAD
5
+ ggIPADCCAgoCggIBAL42zY6E1q0RJIr9j+T6bPb7/f0RbwLJ2hza0/4qjAisNGQs
6
+ t1WkWvpNR/l0+JHmXw78KQ1k8/WP+niIXZmakZdrMNQOf+BBY+MoNqFHtA1KoP0p
7
+ b7f0hyQyRprYihSllA3uFZEagaylx9z5TliwclnCvB77whRZFU8f5PXH+wibWFvJ
8
+ n4ycdFVLg93Rb6IiliMytc3CA4TEemDiL5410nZNipWGcYRmTUruWZCADYLSh6D+
9
+ VJvY/sfoteBX1cvhCdL6DORKaxZnXsPthzkDPJYgLn+1E9hJ4vhuqgXIJ7VjqrPZ
10
+ 0wJtciZYb9YcJM6OqiWavW8AeLOEySEKO4NEGU0JduFpu4/9xnfhv/Atdv9YwK6j
11
+ mJmxl/bV9dPhjszNG/D+RbCeBdhWebL1zcnt8indigLxSI9UgulBnjCJg4xHrJPO
12
+ 9tiXPi4ipFL4tIpiW4NYCWnJXAkCNgPBFGeFaEmzAxoiSh/iBIMfUgfMV26HzOUS
13
+ 2MAzq04/2nH4MjsZYtIKNx8sNZvC3QnDVH1ncGC8JcbSVZPH2jBmMRJJjhxDT7wM
14
+ JbgJJomJ1mIP3a03FJpLTCxP8IbBTmq3TuOpqmhmiVHjBunACbNf6l6fhOJG3pMk
15
+ +VpWtIUiKyNMXvjxgM5bKi6sx1ivInxmPk0f2BPBTrYeLFCTj711A4XuHxSzAgMB
16
+ AAGjQjBAMBEGCWCGSAGG+EIBAQQEAwIHgDALBgNVHQ8EBAMCB4AwEwYDVR0lBAww
17
+ CgYIKwYBBQUHAwIwCQYDVR0TBAIwADANBgkqhkiG9w0BAQsFAAOCAgEANZtBnHeo
18
+ yatrA/s2BzOU0k4WGEUaFMrCi6cDyVAWQ6mhcQHqJ2C8Yi2xCd5Si2BEC0hiyJ4K
19
+ wOpi/bkoyAh67bX/RchzqLTwfUYyM17ZH5yiqbPufjpJQAitAVaywCI0jXDpaYlM
20
+ o2u6b3u8eUKhlfHSIzTJn1sVc0p0Ql0okhrHwwUfwN1lwkVDR/e+jF5GKAwjnkNc
21
+ yu3yYYz0oHAg6ZOcQaaFASX7oBBpYnHfDvou3uoJTGfKevRgI5NwQDRG3gipudSi
22
+ vIwWR2iyBjTZaICChmaBX7zVHLwOFN0LRv73tgEBcJwZ4oCvE64POpAL2pO+U52d
23
+ fIFlIOPSuILtTTtBRvfTuIjEvVCF44g4JkPgPpaN9yPcdAOnBQkP7RkrMlQ1pKZ3
24
+ S6uZh9Ar0jNx59ijYq2Y8o/yyEVveXIKbp3HLogfcLeEWUqjL3syP72WkfBWRWx9
25
+ QELaYrFFxgtT4bKZSmyK4C4qwgSknm89Xp/JZFyKWAjYEmu9BAHDI29IBVbLzQAS
26
+ ezrtG2CmyhejnGhwSMYNmv+dC+ahSeP5FQiixrrxaTJ0s3Ax5mvbQQqv9lBvkn9Z
27
+ WpVNN5MHdHEWnvbK4kfFnVQIBfv3lvPl0C0vk3VSWZexXIOjNtkUK6/ALHV2n5AA
28
+ BEJmC3OPyT3eNrlr7gCxuMoV6uDMeTCRpTY=
29
+ -----END CERTIFICATE-----