aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/python
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/python')
-rw-r--r--contrib/python/responses/py3/.dist-info/METADATA3
-rw-r--r--contrib/python/responses/py3/ya.make2
-rw-r--r--contrib/python/ydb/py2/.dist-info/METADATA63
-rw-r--r--contrib/python/ydb/py2/.dist-info/top_level.txt2
-rw-r--r--contrib/python/ydb/py2/.yandex_meta/yamaker.yaml12
-rw-r--r--contrib/python/ydb/py2/AUTHORS4
-rw-r--r--contrib/python/ydb/py2/LICENSE202
-rw-r--r--contrib/python/ydb/py2/README.md37
-rw-r--r--contrib/python/ydb/py2/patches/01-arcadia-protobufs.patch134
-rw-r--r--contrib/python/ydb/py2/patches/02-original-ydb-protobuf-compatible.patch125
-rw-r--r--contrib/python/ydb/py2/ya.make71
-rw-r--r--contrib/python/ydb/py2/ydb/__init__.py20
-rw-r--r--contrib/python/ydb/py2/ydb/_apis.py96
-rw-r--r--contrib/python/ydb/py2/ydb/_errors.py60
-rw-r--r--contrib/python/ydb/py2/ydb/_session_impl.py498
-rw-r--r--contrib/python/ydb/py2/ydb/_sp_impl.py399
-rw-r--r--contrib/python/ydb/py2/ydb/_tx_ctx_impl.py179
-rw-r--r--contrib/python/ydb/py2/ydb/_utilities.py161
-rw-r--r--contrib/python/ydb/py2/ydb/auth_helpers.py57
-rw-r--r--contrib/python/ydb/py2/ydb/connection.py550
-rw-r--r--contrib/python/ydb/py2/ydb/convert.py514
-rw-r--r--contrib/python/ydb/py2/ydb/credentials.py234
-rw-r--r--contrib/python/ydb/py2/ydb/dbapi/__init__.py47
-rw-r--r--contrib/python/ydb/py2/ydb/dbapi/connection.py92
-rw-r--r--contrib/python/ydb/py2/ydb/dbapi/cursor.py184
-rw-r--r--contrib/python/ydb/py2/ydb/dbapi/errors.py103
-rw-r--r--contrib/python/ydb/py2/ydb/default_pem.py4691
-rw-r--r--contrib/python/ydb/py2/ydb/driver.py242
-rw-r--r--contrib/python/ydb/py2/ydb/export.py280
-rw-r--r--contrib/python/ydb/py2/ydb/global_settings.py16
-rw-r--r--contrib/python/ydb/py2/ydb/iam/__init__.py3
-rw-r--r--contrib/python/ydb/py2/ydb/iam/auth.py197
-rw-r--r--contrib/python/ydb/py2/ydb/import_client.py165
-rw-r--r--contrib/python/ydb/py2/ydb/interceptor.py68
-rw-r--r--contrib/python/ydb/py2/ydb/issues.py206
-rw-r--r--contrib/python/ydb/py2/ydb/operation.py101
-rw-r--r--contrib/python/ydb/py2/ydb/pool.py528
-rw-r--r--contrib/python/ydb/py2/ydb/resolver.py209
-rw-r--r--contrib/python/ydb/py2/ydb/scheme.py493
-rw-r--r--contrib/python/ydb/py2/ydb/scripting.py109
-rw-r--r--contrib/python/ydb/py2/ydb/settings.py119
-rw-r--r--contrib/python/ydb/py2/ydb/sqlalchemy/__init__.py298
-rw-r--r--contrib/python/ydb/py2/ydb/sqlalchemy/types.py32
-rw-r--r--contrib/python/ydb/py2/ydb/table.py2682
-rw-r--r--contrib/python/ydb/py2/ydb/tracing.py188
-rw-r--r--contrib/python/ydb/py2/ydb/types.py445
-rw-r--r--contrib/python/ydb/py2/ydb/ydb_version.py1
47 files changed, 3 insertions, 14919 deletions
diff --git a/contrib/python/responses/py3/.dist-info/METADATA b/contrib/python/responses/py3/.dist-info/METADATA
index 69687eb48a..f5e0301e46 100644
--- a/contrib/python/responses/py3/.dist-info/METADATA
+++ b/contrib/python/responses/py3/.dist-info/METADATA
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: responses
-Version: 0.25.6
+Version: 0.25.7
Summary: A utility library for mocking out the `requests` Python library.
Home-page: https://github.com/getsentry/responses
Author: David Cramer
@@ -20,6 +20,7 @@ Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
+Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Software Development
Requires-Python: >=3.8
Description-Content-Type: text/x-rst
diff --git a/contrib/python/responses/py3/ya.make b/contrib/python/responses/py3/ya.make
index f706b20e79..0b191e6b13 100644
--- a/contrib/python/responses/py3/ya.make
+++ b/contrib/python/responses/py3/ya.make
@@ -2,7 +2,7 @@
PY3_LIBRARY()
-VERSION(0.25.6)
+VERSION(0.25.7)
LICENSE(Apache-2.0)
diff --git a/contrib/python/ydb/py2/.dist-info/METADATA b/contrib/python/ydb/py2/.dist-info/METADATA
deleted file mode 100644
index 8ce51199d9..0000000000
--- a/contrib/python/ydb/py2/.dist-info/METADATA
+++ /dev/null
@@ -1,63 +0,0 @@
-Metadata-Version: 2.1
-Name: ydb
-Version: 2.15.2
-Summary: YDB Python SDK
-Home-page: http://github.com/ydb-platform/ydb-python-sdk
-Author: Yandex LLC
-Author-email: ydb@yandex-team.ru
-License: Apache 2.0
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.7
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.6
-Description-Content-Type: text/markdown
-License-File: LICENSE
-License-File: AUTHORS
-Requires-Dist: aiohttp ==3.7.4
-Requires-Dist: enum-compat >=0.0.1
-Requires-Dist: grpcio >=1.5.0
-Requires-Dist: packaging
-Requires-Dist: protobuf <5.0.0,>3.13.0
-Requires-Dist: pytest ==6.2.4
-Requires-Dist: six <2
-Provides-Extra: yc
-Requires-Dist: yandexcloud ; extra == 'yc'
-
-YDB Python SDK
----
-[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://github.com/ydb-platform/ydb/blob/main/LICENSE)
-[![PyPI version](https://badge.fury.io/py/ydb.svg)](https://badge.fury.io/py/ydb)
-[![Functional tests](https://github.com/ydb-platform/ydb-python-sdk/actions/workflows/tests.yaml/badge.svg)](https://github.com/ydb-platform/ydb-python-sdk/actions/workflows/tests.yaml)
-[![Style checks](https://github.com/ydb-platform/ydb-python-sdk/actions/workflows/style.yaml/badge.svg)](https://github.com/ydb-platform/ydb-python-sdk/actions/workflows/style.yaml)
-
-Officially supported Python client for YDB.
-
-## Quickstart
-
-### Prerequisites
-
-- Python 3.8 or higher
-- `pip` version 9.0.1 or higher
-
-If necessary, upgrade your version of `pip`:
-
-```sh
-$ python -m pip install --upgrade pip
-```
-
-If you cannot upgrade `pip` due to a system-owned installation, you can
-run the example in a virtualenv:
-
-```sh
-$ python -m pip install virtualenv
-$ virtualenv venv
-$ source venv/bin/activate
-$ python -m pip install --upgrade pip
-```
-
-Install YDB python sdk:
-
-```sh
-$ python -m pip install ydb
-```
diff --git a/contrib/python/ydb/py2/.dist-info/top_level.txt b/contrib/python/ydb/py2/.dist-info/top_level.txt
deleted file mode 100644
index 7298732379..0000000000
--- a/contrib/python/ydb/py2/.dist-info/top_level.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-kikimr
-ydb
diff --git a/contrib/python/ydb/py2/.yandex_meta/yamaker.yaml b/contrib/python/ydb/py2/.yandex_meta/yamaker.yaml
deleted file mode 100644
index 23d2fc7c7a..0000000000
--- a/contrib/python/ydb/py2/.yandex_meta/yamaker.yaml
+++ /dev/null
@@ -1,12 +0,0 @@
-requirements:
- - aiohttp: null
- - enum-compat: contrib/deprecated/python/enum34
-exclude:
- - kikimr/*
- - ydb/public/*
- - ydb/_grpc/*
- - ydb/aio/*
- - ydb/tornado/*
-mark_as_tests:
- - "**/*_test.py"
-
diff --git a/contrib/python/ydb/py2/AUTHORS b/contrib/python/ydb/py2/AUTHORS
deleted file mode 100644
index 200343e364..0000000000
--- a/contrib/python/ydb/py2/AUTHORS
+++ /dev/null
@@ -1,4 +0,0 @@
-The following authors have created the source code of "YDB Python SDK"
-published and distributed by YANDEX LLC as the owner:
-
-Vitalii Gridnev <gridnevvvit@gmail.com>
diff --git a/contrib/python/ydb/py2/LICENSE b/contrib/python/ydb/py2/LICENSE
deleted file mode 100644
index cabac2dec9..0000000000
--- a/contrib/python/ydb/py2/LICENSE
+++ /dev/null
@@ -1,202 +0,0 @@
-Copyright 2022 YANDEX LLC
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
-Copyright 2022 YANDEX LLC
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
diff --git a/contrib/python/ydb/py2/README.md b/contrib/python/ydb/py2/README.md
deleted file mode 100644
index cfc57eb276..0000000000
--- a/contrib/python/ydb/py2/README.md
+++ /dev/null
@@ -1,37 +0,0 @@
-YDB Python SDK
----
-[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://github.com/ydb-platform/ydb/blob/main/LICENSE)
-[![PyPI version](https://badge.fury.io/py/ydb.svg)](https://badge.fury.io/py/ydb)
-[![Functional tests](https://github.com/ydb-platform/ydb-python-sdk/actions/workflows/tests.yaml/badge.svg)](https://github.com/ydb-platform/ydb-python-sdk/actions/workflows/tests.yaml)
-[![Style checks](https://github.com/ydb-platform/ydb-python-sdk/actions/workflows/style.yaml/badge.svg)](https://github.com/ydb-platform/ydb-python-sdk/actions/workflows/style.yaml)
-
-Officially supported Python client for YDB.
-
-## Quickstart
-
-### Prerequisites
-
-- Python 3.8 or higher
-- `pip` version 9.0.1 or higher
-
-If necessary, upgrade your version of `pip`:
-
-```sh
-$ python -m pip install --upgrade pip
-```
-
-If you cannot upgrade `pip` due to a system-owned installation, you can
-run the example in a virtualenv:
-
-```sh
-$ python -m pip install virtualenv
-$ virtualenv venv
-$ source venv/bin/activate
-$ python -m pip install --upgrade pip
-```
-
-Install YDB python sdk:
-
-```sh
-$ python -m pip install ydb
-```
diff --git a/contrib/python/ydb/py2/patches/01-arcadia-protobufs.patch b/contrib/python/ydb/py2/patches/01-arcadia-protobufs.patch
deleted file mode 100644
index 866a084c8b..0000000000
--- a/contrib/python/ydb/py2/patches/01-arcadia-protobufs.patch
+++ /dev/null
@@ -1,134 +0,0 @@
---- contrib/python/ydb/py2/ydb/_apis.py (index)
-+++ contrib/python/ydb/py2/ydb/_apis.py (working tree)
-@@ -1,42 +1,21 @@
- # -*- coding: utf-8 -*-
--# Workaround for good IDE and universal for runtime
--# noinspection PyUnreachableCode
--if False:
-- from ._grpc.v4 import (
-- ydb_cms_v1_pb2_grpc,
-- ydb_discovery_v1_pb2_grpc,
-- ydb_scheme_v1_pb2_grpc,
-- ydb_table_v1_pb2_grpc,
-- ydb_operation_v1_pb2_grpc,
-- )
-+from contrib.ydb.public.api.grpc import (
-+ ydb_cms_v1_pb2_grpc,
-+ ydb_discovery_v1_pb2_grpc,
-+ ydb_scheme_v1_pb2_grpc,
-+ ydb_table_v1_pb2_grpc,
-+ ydb_operation_v1_pb2_grpc,
-+)
-
-- from ._grpc.v4.protos import (
-- ydb_status_codes_pb2,
-- ydb_discovery_pb2,
-- ydb_scheme_pb2,
-- ydb_table_pb2,
-- ydb_value_pb2,
-- ydb_operation_pb2,
-- ydb_common_pb2,
-- )
--else:
-- from ._grpc.common import (
-- ydb_cms_v1_pb2_grpc,
-- ydb_discovery_v1_pb2_grpc,
-- ydb_scheme_v1_pb2_grpc,
-- ydb_table_v1_pb2_grpc,
-- ydb_operation_v1_pb2_grpc,
-- )
--
-- from ._grpc.common.protos import (
-- ydb_status_codes_pb2,
-- ydb_discovery_pb2,
-- ydb_scheme_pb2,
-- ydb_table_pb2,
-- ydb_value_pb2,
-- ydb_operation_pb2,
-- ydb_common_pb2,
-- )
-+from contrib.ydb.public.api.protos import (
-+ ydb_status_codes_pb2,
-+ ydb_discovery_pb2,
-+ ydb_scheme_pb2,
-+ ydb_table_pb2,
-+ ydb_value_pb2,
-+ ydb_operation_pb2,
-+ ydb_common_pb2,
-+)
-
- StatusIds = ydb_status_codes_pb2.StatusIds
- FeatureFlag = ydb_common_pb2.FeatureFlag
---- contrib/python/ydb/py2/ydb/credentials.py (index)
-+++ contrib/python/ydb/py2/ydb/credentials.py (working tree)
-@@ -8,14 +8,8 @@ from concurrent import futures
- import logging
- import time
-
--# Workaround for good IDE and universal for runtime
--# noinspection PyUnreachableCode
--if False:
-- from ._grpc.v4.protos import ydb_auth_pb2
-- from ._grpc.v4 import ydb_auth_v1_pb2_grpc
--else:
-- from ._grpc.common.protos import ydb_auth_pb2
-- from ._grpc.common import ydb_auth_v1_pb2_grpc
-+from contrib.ydb.public.api.protos import ydb_auth_pb2
-+from contrib.ydb.public.api.grpc import ydb_auth_v1_pb2_grpc
-
-
- YDB_AUTH_TICKET_HEADER = "x-ydb-auth-ticket"
---- contrib/python/ydb/py2/ydb/export.py (index)
-+++ contrib/python/ydb/py2/ydb/export.py (working tree)
-@@ -4,14 +4,8 @@ from . import _apis
-
- from . import settings_impl as s_impl
-
--# Workaround for good IDE and universal for runtime
--# noinspection PyUnreachableCode
--if False:
-- from ._grpc.v4.protos import ydb_export_pb2
-- from ._grpc.v4 import ydb_export_v1_pb2_grpc
--else:
-- from ._grpc.common.protos import ydb_export_pb2
-- from ._grpc.common import ydb_export_v1_pb2_grpc
-+from contrib.ydb.public.api.protos import ydb_export_pb2
-+from contrib.ydb.public.api.grpc import ydb_export_v1_pb2_grpc
-
- from . import operation
-
---- contrib/python/ydb/py2/ydb/import_client.py (index)
-+++ contrib/python/ydb/py2/ydb/import_client.py (working tree)
-@@ -4,14 +4,8 @@ from . import _apis
-
- from . import settings_impl as s_impl
-
--# Workaround for good IDE and universal for runtime
--# noinspection PyUnreachableCode
--if False:
-- from ._grpc.v4.protos import ydb_import_pb2
-- from ._grpc.v4 import ydb_import_v1_pb2_grpc
--else:
-- from ._grpc.common.protos import ydb_import_pb2
-- from ._grpc.common import ydb_import_v1_pb2_grpc
-+from contrib.ydb.public.api.protos import ydb_import_pb2
-+from contrib.ydb.public.api.grpc import ydb_import_v1_pb2_grpc
-
-
- from . import operation
---- contrib/python/ydb/py2/ydb/scripting.py (index)
-+++ contrib/python/ydb/py2/ydb/scripting.py (working tree)
-@@ -1,11 +1,5 @@
--# Workaround for good IDE and universal for runtime
--# noinspection PyUnreachableCode
--if False:
-- from ._grpc.v4.protos import ydb_scripting_pb2
-- from ._grpc.v4 import ydb_scripting_v1_pb2_grpc
--else:
-- from ._grpc.common.protos import ydb_scripting_pb2
-- from ._grpc.common import ydb_scripting_v1_pb2_grpc
-+from contrib.ydb.public.api.protos import ydb_scripting_pb2
-+from contrib.ydb.public.api.grpc import ydb_scripting_v1_pb2_grpc
-
-
- from . import issues, convert, settings
diff --git a/contrib/python/ydb/py2/patches/02-original-ydb-protobuf-compatible.patch b/contrib/python/ydb/py2/patches/02-original-ydb-protobuf-compatible.patch
deleted file mode 100644
index 78ebe6924d..0000000000
--- a/contrib/python/ydb/py2/patches/02-original-ydb-protobuf-compatible.patch
+++ /dev/null
@@ -1,125 +0,0 @@
---- contrib/python/ydb/py2/ydb/_apis.py (index)
-+++ contrib/python/ydb/py2/ydb/_apis.py (working tree)
-@@ -1,21 +1,41 @@
- # -*- coding: utf-8 -*-
--from contrib.ydb.public.api.grpc import (
-- ydb_cms_v1_pb2_grpc,
-- ydb_discovery_v1_pb2_grpc,
-- ydb_scheme_v1_pb2_grpc,
-- ydb_table_v1_pb2_grpc,
-- ydb_operation_v1_pb2_grpc,
--)
-+try:
-+ from ydb.public.api.grpc import (
-+ ydb_cms_v1_pb2_grpc,
-+ ydb_discovery_v1_pb2_grpc,
-+ ydb_scheme_v1_pb2_grpc,
-+ ydb_table_v1_pb2_grpc,
-+ ydb_operation_v1_pb2_grpc,
-+ )
-+
-+ from ydb.public.api.protos import (
-+ ydb_status_codes_pb2,
-+ ydb_discovery_pb2,
-+ ydb_scheme_pb2,
-+ ydb_table_pb2,
-+ ydb_value_pb2,
-+ ydb_operation_pb2,
-+ ydb_common_pb2,
-+ )
-+except ImportError:
-+ from contrib.ydb.public.api.grpc import (
-+ ydb_cms_v1_pb2_grpc,
-+ ydb_discovery_v1_pb2_grpc,
-+ ydb_scheme_v1_pb2_grpc,
-+ ydb_table_v1_pb2_grpc,
-+ ydb_operation_v1_pb2_grpc,
-+ )
-+
-+ from contrib.ydb.public.api.protos import (
-+ ydb_status_codes_pb2,
-+ ydb_discovery_pb2,
-+ ydb_scheme_pb2,
-+ ydb_table_pb2,
-+ ydb_value_pb2,
-+ ydb_operation_pb2,
-+ ydb_common_pb2,
-+ )
-
--from contrib.ydb.public.api.protos import (
-- ydb_status_codes_pb2,
-- ydb_discovery_pb2,
-- ydb_scheme_pb2,
-- ydb_table_pb2,
-- ydb_value_pb2,
-- ydb_operation_pb2,
-- ydb_common_pb2,
--)
-
- StatusIds = ydb_status_codes_pb2.StatusIds
- FeatureFlag = ydb_common_pb2.FeatureFlag
---- contrib/python/ydb/py2/ydb/credentials.py (index)
-+++ contrib/python/ydb/py2/ydb/credentials.py (working tree)
-@@ -8,8 +8,12 @@ from concurrent import futures
- import logging
- import time
-
--from contrib.ydb.public.api.protos import ydb_auth_pb2
--from contrib.ydb.public.api.grpc import ydb_auth_v1_pb2_grpc
-+try:
-+ from ydb.public.api.protos import ydb_auth_pb2
-+ from ydb.public.api.grpc import ydb_auth_v1_pb2_grpc
-+except ImportError:
-+ from contrib.ydb.public.api.protos import ydb_auth_pb2
-+ from contrib.ydb.public.api.grpc import ydb_auth_v1_pb2_grpc
-
-
- YDB_AUTH_TICKET_HEADER = "x-ydb-auth-ticket"
---- contrib/python/ydb/py2/ydb/export.py (index)
-+++ contrib/python/ydb/py2/ydb/export.py (working tree)
-@@ -4,8 +4,12 @@ from . import _apis
-
- from . import settings_impl as s_impl
-
--from contrib.ydb.public.api.protos import ydb_export_pb2
--from contrib.ydb.public.api.grpc import ydb_export_v1_pb2_grpc
-+try:
-+ from ydb.public.api.protos import ydb_export_pb2
-+ from ydb.public.api.grpc import ydb_export_v1_pb2_grpc
-+except ImportError:
-+ from contrib.ydb.public.api.protos import ydb_export_pb2
-+ from contrib.ydb.public.api.grpc import ydb_export_v1_pb2_grpc
-
- from . import operation
-
---- contrib/python/ydb/py2/ydb/import_client.py (index)
-+++ contrib/python/ydb/py2/ydb/import_client.py (working tree)
-@@ -4,8 +4,12 @@ from . import _apis
-
- from . import settings_impl as s_impl
-
--from contrib.ydb.public.api.protos import ydb_import_pb2
--from contrib.ydb.public.api.grpc import ydb_import_v1_pb2_grpc
-+try:
-+ from ydb.public.api.protos import ydb_import_pb2
-+ from ydb.public.api.grpc import ydb_import_v1_pb2_grpc
-+except ImportError:
-+ from contrib.ydb.public.api.protos import ydb_import_pb2
-+ from contrib.ydb.public.api.grpc import ydb_import_v1_pb2_grpc
-
-
- from . import operation
---- contrib/python/ydb/py2/ydb/scripting.py (index)
-+++ contrib/python/ydb/py2/ydb/scripting.py (working tree)
-@@ -1,5 +1,9 @@
--from contrib.ydb.public.api.protos import ydb_scripting_pb2
--from contrib.ydb.public.api.grpc import ydb_scripting_v1_pb2_grpc
-+try:
-+ from ydb.public.api.protos import ydb_scripting_pb2
-+ from ydb.public.api.grpc import ydb_scripting_v1_pb2_grpc
-+except ImportError:
-+ from contrib.ydb.public.api.protos import ydb_scripting_pb2
-+ from contrib.ydb.public.api.grpc import ydb_scripting_v1_pb2_grpc
-
-
- from . import issues, convert, settings
diff --git a/contrib/python/ydb/py2/ya.make b/contrib/python/ydb/py2/ya.make
deleted file mode 100644
index a339cb2916..0000000000
--- a/contrib/python/ydb/py2/ya.make
+++ /dev/null
@@ -1,71 +0,0 @@
-# Generated by devtools/yamaker (pypi).
-
-PY2_LIBRARY()
-
-VERSION(2.15.2)
-
-LICENSE(Apache-2.0)
-
-PEERDIR(
- contrib/deprecated/python/enum34
- contrib/python/grpcio
- contrib/python/packaging
- contrib/python/protobuf
- contrib/python/pytest
- contrib/python/six
-)
-
-NO_LINT()
-
-NO_CHECK_IMPORTS(
- ydb.public.api.grpc
- ydb.public.api.grpc.*
-)
-
-PY_SRCS(
- TOP_LEVEL
- ydb/__init__.py
- ydb/_apis.py
- ydb/_errors.py
- ydb/_session_impl.py
- ydb/_sp_impl.py
- ydb/_tx_ctx_impl.py
- ydb/_utilities.py
- ydb/auth_helpers.py
- ydb/connection.py
- ydb/convert.py
- ydb/credentials.py
- ydb/dbapi/__init__.py
- ydb/dbapi/connection.py
- ydb/dbapi/cursor.py
- ydb/dbapi/errors.py
- ydb/default_pem.py
- ydb/driver.py
- ydb/export.py
- ydb/global_settings.py
- ydb/iam/__init__.py
- ydb/iam/auth.py
- ydb/import_client.py
- ydb/interceptor.py
- ydb/issues.py
- ydb/operation.py
- ydb/pool.py
- ydb/resolver.py
- ydb/scheme.py
- ydb/scripting.py
- ydb/settings.py
- ydb/sqlalchemy/__init__.py
- ydb/sqlalchemy/types.py
- ydb/table.py
- ydb/tracing.py
- ydb/types.py
- ydb/ydb_version.py
-)
-
-RESOURCE_FILES(
- PREFIX contrib/python/ydb/py2/
- .dist-info/METADATA
- .dist-info/top_level.txt
-)
-
-END()
diff --git a/contrib/python/ydb/py2/ydb/__init__.py b/contrib/python/ydb/py2/ydb/__init__.py
deleted file mode 100644
index 56b73478eb..0000000000
--- a/contrib/python/ydb/py2/ydb/__init__.py
+++ /dev/null
@@ -1,20 +0,0 @@
-from .credentials import * # noqa
-from .driver import * # noqa
-from .global_settings import * # noqa
-from .table import * # noqa
-from .issues import * # noqa
-from .types import * # noqa
-from .scheme import * # noqa
-from .settings import * # noqa
-from .resolver import * # noqa
-from .export import * # noqa
-from .auth_helpers import * # noqa
-from .operation import * # noqa
-from .scripting import * # noqa
-from .import_client import * # noqa
-from .tracing import * # noqa
-
-try:
- import ydb.aio as aio # noqa
-except Exception:
- pass
diff --git a/contrib/python/ydb/py2/ydb/_apis.py b/contrib/python/ydb/py2/ydb/_apis.py
deleted file mode 100644
index 89efac6041..0000000000
--- a/contrib/python/ydb/py2/ydb/_apis.py
+++ /dev/null
@@ -1,96 +0,0 @@
-# -*- coding: utf-8 -*-
-try:
- from ydb.public.api.grpc import (
- ydb_cms_v1_pb2_grpc,
- ydb_discovery_v1_pb2_grpc,
- ydb_scheme_v1_pb2_grpc,
- ydb_table_v1_pb2_grpc,
- ydb_operation_v1_pb2_grpc,
- )
-
- from ydb.public.api.protos import (
- ydb_status_codes_pb2,
- ydb_discovery_pb2,
- ydb_scheme_pb2,
- ydb_table_pb2,
- ydb_value_pb2,
- ydb_operation_pb2,
- ydb_common_pb2,
- )
-except ImportError:
- from contrib.ydb.public.api.grpc import (
- ydb_cms_v1_pb2_grpc,
- ydb_discovery_v1_pb2_grpc,
- ydb_scheme_v1_pb2_grpc,
- ydb_table_v1_pb2_grpc,
- ydb_operation_v1_pb2_grpc,
- )
-
- from contrib.ydb.public.api.protos import (
- ydb_status_codes_pb2,
- ydb_discovery_pb2,
- ydb_scheme_pb2,
- ydb_table_pb2,
- ydb_value_pb2,
- ydb_operation_pb2,
- ydb_common_pb2,
- )
-
-
-StatusIds = ydb_status_codes_pb2.StatusIds
-FeatureFlag = ydb_common_pb2.FeatureFlag
-primitive_types = ydb_value_pb2.Type.PrimitiveTypeId
-ydb_value = ydb_value_pb2
-ydb_scheme = ydb_scheme_pb2
-ydb_table = ydb_table_pb2
-ydb_discovery = ydb_discovery_pb2
-ydb_operation = ydb_operation_pb2
-
-
-class CmsService(object):
- Stub = ydb_cms_v1_pb2_grpc.CmsServiceStub
-
-
-class DiscoveryService(object):
- Stub = ydb_discovery_v1_pb2_grpc.DiscoveryServiceStub
- ListEndpoints = "ListEndpoints"
-
-
-class OperationService(object):
- Stub = ydb_operation_v1_pb2_grpc.OperationServiceStub
- ForgetOperation = "ForgetOperation"
- GetOperation = "GetOperation"
- CancelOperation = "CancelOperation"
-
-
-class SchemeService(object):
- Stub = ydb_scheme_v1_pb2_grpc.SchemeServiceStub
- MakeDirectory = "MakeDirectory"
- RemoveDirectory = "RemoveDirectory"
- ListDirectory = "ListDirectory"
- DescribePath = "DescribePath"
- ModifyPermissions = "ModifyPermissions"
-
-
-class TableService(object):
- Stub = ydb_table_v1_pb2_grpc.TableServiceStub
-
- StreamExecuteScanQuery = "StreamExecuteScanQuery"
- ExplainDataQuery = "ExplainDataQuery"
- CreateTable = "CreateTable"
- DropTable = "DropTable"
- AlterTable = "AlterTable"
- CopyTables = "CopyTables"
- RenameTables = "RenameTables"
- DescribeTable = "DescribeTable"
- CreateSession = "CreateSession"
- DeleteSession = "DeleteSession"
- ExecuteSchemeQuery = "ExecuteSchemeQuery"
- PrepareDataQuery = "PrepareDataQuery"
- ExecuteDataQuery = "ExecuteDataQuery"
- BeginTransaction = "BeginTransaction"
- CommitTransaction = "CommitTransaction"
- RollbackTransaction = "RollbackTransaction"
- KeepAlive = "KeepAlive"
- StreamReadTable = "StreamReadTable"
- BulkUpsert = "BulkUpsert"
diff --git a/contrib/python/ydb/py2/ydb/_errors.py b/contrib/python/ydb/py2/ydb/_errors.py
deleted file mode 100644
index 84ac23db76..0000000000
--- a/contrib/python/ydb/py2/ydb/_errors.py
+++ /dev/null
@@ -1,60 +0,0 @@
-from . import issues
-
-_errors_retriable_fast_backoff_types = [
- issues.Unavailable,
-]
-_errors_retriable_slow_backoff_types = [
- issues.Aborted,
- issues.BadSession,
- issues.Overloaded,
- issues.SessionPoolEmpty,
- issues.ConnectionError,
-]
-_errors_retriable_slow_backoff_idempotent_types = [
- issues.Undetermined,
-]
-
-
-def check_retriable_error(err, retry_settings, attempt):
- if isinstance(err, issues.NotFound):
- if retry_settings.retry_not_found:
- return ErrorRetryInfo(
- True, retry_settings.fast_backoff.calc_timeout(attempt)
- )
- else:
- return ErrorRetryInfo(False, None)
-
- if isinstance(err, issues.InternalError):
- if retry_settings.retry_internal_error:
- return ErrorRetryInfo(
- True, retry_settings.slow_backoff.calc_timeout(attempt)
- )
- else:
- return ErrorRetryInfo(False, None)
-
- for t in _errors_retriable_fast_backoff_types:
- if isinstance(err, t):
- return ErrorRetryInfo(
- True, retry_settings.fast_backoff.calc_timeout(attempt)
- )
-
- for t in _errors_retriable_slow_backoff_types:
- if isinstance(err, t):
- return ErrorRetryInfo(
- True, retry_settings.slow_backoff.calc_timeout(attempt)
- )
-
- if retry_settings.idempotent:
- for t in _errors_retriable_slow_backoff_idempotent_types:
- if isinstance(err, t):
- return ErrorRetryInfo(
- True, retry_settings.slow_backoff.calc_timeout(attempt)
- )
-
- return ErrorRetryInfo(False, None)
-
-
-class ErrorRetryInfo:
- def __init__(self, is_retriable, sleep_timeout_seconds=None):
- self.is_retriable = is_retriable
- self.sleep_timeout_seconds = sleep_timeout_seconds
diff --git a/contrib/python/ydb/py2/ydb/_session_impl.py b/contrib/python/ydb/py2/ydb/_session_impl.py
deleted file mode 100644
index 27d7a3f6a0..0000000000
--- a/contrib/python/ydb/py2/ydb/_session_impl.py
+++ /dev/null
@@ -1,498 +0,0 @@
-import functools
-from google.protobuf.empty_pb2 import Empty
-from . import issues, types, _apis, convert, scheme, operation, _utilities
-
-X_YDB_SERVER_HINTS = "x-ydb-server-hints"
-X_YDB_SESSION_CLOSE = "session-close"
-
-
-def _check_session_is_closing(rpc_state, session_state):
- metadata = rpc_state.trailing_metadata()
- if X_YDB_SESSION_CLOSE in metadata.get(X_YDB_SERVER_HINTS, []):
- session_state.set_closing()
-
-
-def bad_session_handler(func):
- @functools.wraps(func)
- def decorator(rpc_state, response_pb, session_state, *args, **kwargs):
- try:
- _check_session_is_closing(rpc_state, session_state)
- return func(rpc_state, response_pb, session_state, *args, **kwargs)
- except issues.BadSession:
- session_state.reset()
- raise
-
- return decorator
-
-
-@bad_session_handler
-def wrap_prepare_query_response(rpc_state, response_pb, session_state, yql_text):
- session_state.complete_query()
- issues._process_response(response_pb.operation)
- message = _apis.ydb_table.PrepareQueryResult()
- response_pb.operation.result.Unpack(message)
- data_query = types.DataQuery(yql_text, message.parameters_types)
- session_state.keep(data_query, message.query_id)
- return data_query
-
-
-def prepare_request_factory(session_state, yql_text):
- request = session_state.start_query().attach_request(
- _apis.ydb_table.PrepareDataQueryRequest()
- )
- request.yql_text = yql_text
- return request
-
-
-class AlterTableOperation(operation.Operation):
- def __init__(self, rpc_state, response_pb, driver):
- super(AlterTableOperation, self).__init__(rpc_state, response_pb, driver)
- self.ready = response_pb.operation.ready
-
-
-def copy_tables_request_factory(session_state, source_destination_pairs):
- request = session_state.attach_request(_apis.ydb_table.CopyTablesRequest())
- for source_path, destination_path in source_destination_pairs:
- table_item = request.tables.add()
- table_item.source_path = source_path
- table_item.destination_path = destination_path
- return request
-
-
-def rename_tables_request_factory(session_state, rename_items):
- request = session_state.attach_request(_apis.ydb_table.RenameTablesRequest())
- for item in rename_items:
- table_item = request.tables.add()
- table_item.source_path = item.source_path
- table_item.destination_path = item.destination_path
- table_item.replace_destination = item.replace_destination
- return request
-
-
-def explain_data_query_request_factory(session_state, yql_text):
- request = session_state.start_query().attach_request(
- _apis.ydb_table.ExplainDataQueryRequest()
- )
- request.yql_text = yql_text
- return request
-
-
-class _ExplainResponse(object):
- def __init__(self, ast, plan):
- self.query_ast = ast
- self.query_plan = plan
-
-
-def wrap_explain_response(rpc_state, response_pb, session_state):
- session_state.complete_query()
- issues._process_response(response_pb.operation)
- message = _apis.ydb_table.ExplainQueryResult()
- response_pb.operation.result.Unpack(message)
- return _ExplainResponse(message.query_ast, message.query_plan)
-
-
-@bad_session_handler
-def wrap_execute_scheme_result(rpc_state, response_pb, session_state):
- session_state.complete_query()
- issues._process_response(response_pb.operation)
- message = _apis.ydb_table.ExecuteQueryResult()
- response_pb.operation.result.Unpack(message)
- return convert.ResultSets(message.result_sets)
-
-
-def execute_scheme_request_factory(session_state, yql_text):
- request = session_state.start_query().attach_request(
- _apis.ydb_table.ExecuteSchemeQueryRequest()
- )
- request.yql_text = yql_text
- return request
-
-
-@bad_session_handler
-def wrap_describe_table_response(
- rpc_state, response_pb, sesssion_state, scheme_entry_cls
-):
- issues._process_response(response_pb.operation)
- message = _apis.ydb_table.DescribeTableResult()
- response_pb.operation.result.Unpack(message)
- return scheme._wrap_scheme_entry(
- message.self,
- scheme_entry_cls,
- message.columns,
- message.primary_key,
- message.shard_key_bounds,
- message.indexes,
- message.table_stats if message.HasField("table_stats") else None,
- message.ttl_settings if message.HasField("ttl_settings") else None,
- message.attributes,
- message.partitioning_settings
- if message.HasField("partitioning_settings")
- else None,
- message.column_families,
- message.key_bloom_filter,
- message.read_replicas_settings
- if message.HasField("read_replicas_settings")
- else None,
- message.storage_settings if message.HasField("storage_settings") else None,
- )
-
-
-def explicit_partitions_factory(primary_key, columns, split_points):
- column_types = {}
- pk = set(primary_key)
- for column in columns:
- if column.name in pk:
- column_types[column.name] = column.type
-
- explicit_partitions = _apis.ydb_table.ExplicitPartitions()
- for split_point in split_points:
- typed_value = explicit_partitions.split_points.add()
- split_point_type = types.TupleType()
- prefix_size = len(split_point.value)
- for pl_el_id, pk_name in enumerate(primary_key):
- if pl_el_id >= prefix_size:
- break
-
- split_point_type.add_element(column_types[pk_name])
-
- typed_value.type.MergeFrom(split_point_type.proto)
- typed_value.value.MergeFrom(
- convert.from_native_value(split_point_type.proto, split_point.value)
- )
-
- return explicit_partitions
-
-
-def create_table_request_factory(session_state, path, table_description):
- if isinstance(table_description, _apis.ydb_table.CreateTableRequest):
- request = session_state.attach_request(table_description)
- return request
-
- request = _apis.ydb_table.CreateTableRequest()
- request.path = path
- request.primary_key.extend(list(table_description.primary_key))
- for column in table_description.columns:
- request.columns.add(name=column.name, type=column.type_pb, family=column.family)
-
- if table_description.profile is not None:
- request.profile.MergeFrom(table_description.profile.to_pb(table_description))
-
- for index in table_description.indexes:
- request.indexes.add().MergeFrom(index.to_pb())
-
- if table_description.ttl_settings is not None:
- request.ttl_settings.MergeFrom(table_description.ttl_settings.to_pb())
-
- request.attributes.update(table_description.attributes)
-
- if table_description.column_families:
- for column_family in table_description.column_families:
- request.column_families.add().MergeFrom(column_family.to_pb())
-
- if table_description.storage_settings is not None:
- request.storage_settings.MergeFrom(table_description.storage_settings.to_pb())
-
- if table_description.read_replicas_settings is not None:
- request.read_replicas_settings.MergeFrom(
- table_description.read_replicas_settings.to_pb()
- )
-
- if table_description.partitioning_settings is not None:
- request.partitioning_settings.MergeFrom(
- table_description.partitioning_settings.to_pb()
- )
-
- request.key_bloom_filter = table_description.key_bloom_filter
- if table_description.compaction_policy is not None:
- request.compaction_policy = table_description.compaction_policy
- if table_description.partition_at_keys is not None:
- request.partition_at_keys.MergeFrom(
- explicit_partitions_factory(
- list(table_description.primary_key),
- table_description.columns,
- table_description.partition_at_keys.split_points,
- )
- )
-
- elif table_description.uniform_partitions > 0:
- request.uniform_partitions = table_description.uniform_partitions
-
- return session_state.attach_request(request)
-
-
-def keep_alive_request_factory(session_state):
- request = _apis.ydb_table.KeepAliveRequest()
- return session_state.attach_request(request)
-
-
-@bad_session_handler
-def cleanup_session(rpc_state, response_pb, session_state, session):
- issues._process_response(response_pb.operation)
- session_state.reset()
- return session
-
-
-@bad_session_handler
-def initialize_session(rpc_state, response_pb, session_state, session):
- issues._process_response(response_pb.operation)
- message = _apis.ydb_table.CreateSessionResult()
- response_pb.operation.result.Unpack(message)
- session_state.set_id(message.session_id).attach_endpoint(rpc_state.endpoint_key)
- return session
-
-
-@bad_session_handler
-def wrap_operation(rpc_state, response_pb, session_state, driver=None):
- return operation.Operation(rpc_state, response_pb, driver)
-
-
-def wrap_operation_bulk_upsert(rpc_state, response_pb, driver=None):
- return operation.Operation(rpc_state, response_pb, driver)
-
-
-@bad_session_handler
-def wrap_keep_alive_response(rpc_state, response_pb, session_state, session):
- issues._process_response(response_pb.operation)
- return session
-
-
-def describe_table_request_factory(session_state, path, settings=None):
- request = session_state.attach_request(_apis.ydb_table.DescribeTableRequest())
- request.path = path
-
- if (
- settings is not None
- and hasattr(settings, "include_shard_key_bounds")
- and settings.include_shard_key_bounds
- ):
- request.include_shard_key_bounds = settings.include_shard_key_bounds
-
- if (
- settings is not None
- and hasattr(settings, "include_table_stats")
- and settings.include_table_stats
- ):
- request.include_table_stats = settings.include_table_stats
-
- return request
-
-
-def alter_table_request_factory(
- session_state,
- path,
- add_columns,
- drop_columns,
- alter_attributes,
- add_indexes,
- drop_indexes,
- set_ttl_settings,
- drop_ttl_settings,
- add_column_families,
- alter_column_families,
- alter_storage_settings,
- set_compaction_policy,
- alter_partitioning_settings,
- set_key_bloom_filter,
- set_read_replicas_settings,
-):
- request = session_state.attach_request(_apis.ydb_table.AlterTableRequest(path=path))
- if add_columns is not None:
- for column in add_columns:
- request.add_columns.add(name=column.name, type=column.type_pb)
-
- if drop_columns is not None:
- request.drop_columns.extend(list(drop_columns))
-
- if drop_indexes is not None:
- request.drop_indexes.extend(list(drop_indexes))
-
- if add_indexes is not None:
- for index in add_indexes:
- request.add_indexes.add().MergeFrom(index.to_pb())
-
- if alter_attributes is not None:
- request.alter_attributes.update(alter_attributes)
-
- if set_ttl_settings is not None:
- request.set_ttl_settings.MergeFrom(set_ttl_settings.to_pb())
-
- if drop_ttl_settings is not None and drop_ttl_settings:
- request.drop_ttl_settings.MergeFrom(Empty())
-
- if add_column_families is not None:
- for column_family in add_column_families:
- request.add_column_families.add().MergeFrom(column_family.to_pb())
-
- if alter_column_families is not None:
- for column_family in alter_column_families:
- request.alter_column_families.add().MergeFrom(column_family.to_pb())
-
- if alter_storage_settings is not None:
- request.alter_storage_settings.MergeFrom(alter_storage_settings.to_pb())
-
- if set_compaction_policy is not None:
- request.set_compaction_policy = set_compaction_policy
-
- if alter_partitioning_settings is not None:
- request.alter_partitioning_settings.MergeFrom(
- alter_partitioning_settings.to_pb()
- )
-
- if set_key_bloom_filter is not None:
- request.set_key_bloom_filter = set_key_bloom_filter
-
- if set_read_replicas_settings is not None:
- request.set_read_replicas_settings.MergeFrom(set_read_replicas_settings.to_pb())
-
- return request
-
-
-def read_table_request_factory(
- session_state,
- path,
- key_range=None,
- columns=None,
- ordered=False,
- row_limit=None,
- use_snapshot=None,
-):
- request = _apis.ydb_table.ReadTableRequest()
- request.path = path
- request.ordered = ordered
- if key_range is not None and key_range.from_bound is not None:
- target_attribute = (
- "greater_or_equal" if key_range.from_bound.is_inclusive() else "greater"
- )
- getattr(request.key_range, target_attribute).MergeFrom(
- convert.to_typed_value_from_native(
- key_range.from_bound.type, key_range.from_bound.value
- )
- )
-
- if key_range is not None and key_range.to_bound is not None:
- target_attribute = (
- "less_or_equal" if key_range.to_bound.is_inclusive() else "less"
- )
- getattr(request.key_range, target_attribute).MergeFrom(
- convert.to_typed_value_from_native(
- key_range.to_bound.type, key_range.to_bound.value
- )
- )
-
- if columns is not None:
- for column in columns:
- request.columns.append(column)
- if row_limit:
- # NOTE(gvit): pylint cannot understand that row_limit is not None
- request.row_limit = row_limit # pylint: disable=E5903
- if use_snapshot is not None:
- if isinstance(use_snapshot, bool):
- if use_snapshot:
- request.use_snapshot = _apis.FeatureFlag.ENABLED
- else:
- request.use_snapshot = _apis.FeatureFlag.DISABLED
- else:
- request.use_snapshot = use_snapshot
- return session_state.attach_request(request)
-
-
-def bulk_upsert_request_factory(table, rows, column_types):
- request = _apis.ydb_table.BulkUpsertRequest()
- request.table = table
- request.rows.MergeFrom(
- convert.to_typed_value_from_native(types.ListType(column_types).proto, rows)
- )
- return request
-
-
-def wrap_read_table_response(response):
- issues._process_response(response)
- snapshot = response.snapshot if response.HasField("snapshot") else None
- return convert.ResultSet.from_message(response.result.result_set, snapshot=snapshot)
-
-
-class SessionState(object):
- def __init__(self, table_client_settings):
- self._session_id = None
- self._query_cache = _utilities.LRUCache(1000)
- self._default = (None, None)
- self._pending_query = False
- self._endpoint = None
- self._closing = False
- self._client_cache_enabled = table_client_settings._client_query_cache_enabled
- self.table_client_settings = table_client_settings
-
- def __contains__(self, query):
- return self.lookup(query) != self._default
-
- def reset(self):
- self._query_cache = _utilities.LRUCache(1000)
- self._session_id = None
- self._pending_query = False
- self._endpoint = None
-
- def attach_endpoint(self, endpoint):
- self._endpoint = endpoint
- return self
-
- def set_closing(self):
- self._closing = True
- return self
-
- def closing(self):
- return self._closing
-
- @property
- def endpoint(self):
- return self._endpoint
-
- @property
- def session_id(self):
- return self._session_id
-
- def pending_query(self):
- return self._pending_query
-
- def set_id(self, session_id):
- self._session_id = session_id
- return self
-
- def keep(self, query, query_id):
- if self._client_cache_enabled:
- self._query_cache.put(query.name, (query, query_id))
- else:
- self._query_cache.put(query.name, (query, None))
- return self
-
- @staticmethod
- def _query_key(query):
- return (
- query.name
- if isinstance(query, types.DataQuery)
- else _utilities.get_query_hash(query)
- )
-
- def lookup(self, query):
- return self._query_cache.get(self._query_key(query), self._default)
-
- def erase(self, query):
- query, _ = self.lookup(query)
- self._query_cache.erase(query.name)
-
- def complete_query(self):
- self._pending_query = False
- return self
-
- def start_query(self):
- if self._pending_query:
- # don't invalidate session at this point
- self.reset()
- raise issues.BadSession("Pending previous query completion!")
- self._pending_query = True
- return self
-
- def attach_request(self, request):
- if self._session_id is None:
- raise issues.BadSession("Empty session_id")
- request.session_id = self._session_id
- return request
diff --git a/contrib/python/ydb/py2/ydb/_sp_impl.py b/contrib/python/ydb/py2/ydb/_sp_impl.py
deleted file mode 100644
index a8529d7321..0000000000
--- a/contrib/python/ydb/py2/ydb/_sp_impl.py
+++ /dev/null
@@ -1,399 +0,0 @@
-# -*- coding: utf-8 -*-
-import collections
-from concurrent import futures
-from six.moves import queue
-import time
-import threading
-from . import settings, issues, _utilities, tracing
-
-
-class SessionPoolImpl(object):
- def __init__(
- self,
- logger,
- driver,
- size,
- workers_threads_count=4,
- initializer=None,
- min_pool_size=0,
- ):
- self._lock = threading.RLock()
- self._waiters = collections.OrderedDict()
- self._driver = driver
- if hasattr(driver, "_driver_config"):
- self.tracer = driver._driver_config.tracer
- else:
- self.tracer = tracing.Tracer(None)
- self._active_queue = queue.PriorityQueue()
- self._active_count = 0
- self._size = size
- self._req_settings = settings.BaseRequestSettings().with_timeout(3)
- self._tp = futures.ThreadPoolExecutor(workers_threads_count)
- self._initializer = initializer
- self._should_stop = threading.Event()
- self._keep_alive_threshold = 4 * 60
- self._spin_timeout = 30
- self._event_queue = queue.Queue()
- self._driver_await_timeout = 3
- self._event_loop_thread = threading.Thread(target=self.events_loop)
- self._event_loop_thread.daemon = True
- self._event_loop_thread.start()
- self._logger = logger
- self._min_pool_size = min_pool_size
- self._terminating = False
- if self._min_pool_size > self._size:
- raise ValueError("Invalid min pool size value!")
- for _ in range(self._min_pool_size):
- self._prepare(self._create())
-
- def stop(self, timeout):
- with self._lock:
- self._logger.debug("Requested session pool stop.")
- self._event_queue.put(self._terminate_event)
- self._should_stop.set()
- self._terminating = True
-
- self._logger.debug(
- "Session pool is under stop, cancelling all in flight waiters."
- )
- while True:
- try:
- _, waiter = self._waiters.popitem(last=False)
- session = self._create()
- waiter.set_result(session)
- self._logger.debug(
- "Waiter %s has been replied with empty session info. Session details: %s.",
- waiter,
- session,
- )
- except KeyError:
- break
-
- self._logger.debug("Destroying sessions in active queue")
- while True:
- try:
- _, session = self._active_queue.get(block=False)
- self._destroy(session, "session-pool-terminated")
-
- except queue.Empty:
- break
-
- self._logger.debug("Destroyed active sessions")
-
- self._event_loop_thread.join(timeout)
-
- def _terminate_event(self):
- self._logger.debug("Terminated session pool.")
- raise StopIteration()
-
- def _delayed_prepare(self, session):
- try:
- self._driver.wait(self._driver_await_timeout, fail_fast=False)
- except Exception:
- pass
-
- self._prepare(session)
-
- def pick(self):
- with self._lock:
- try:
- priority, session = self._active_queue.get_nowait()
- except queue.Empty:
- return None
-
- till_expire = priority - time.time()
- if till_expire < self._keep_alive_threshold:
- return session
- self._active_queue.put((priority, session))
- return None
-
- def _create(self):
- with self._lock:
- session = self._driver.table_client.session()
- self._logger.debug("Created session %s", session)
- self._active_count += 1
- return session
-
- @property
- def active_size(self):
- with self._lock:
- return self._active_count
-
- @property
- def free_size(self):
- with self._lock:
- return self._active_queue.qsize()
-
- @property
- def busy_size(self):
- with self._lock:
- return self._active_count - self._active_queue.qsize()
-
- @property
- def max_size(self):
- return self._size
-
- @property
- def waiters_count(self):
- with self._lock:
- return len(self._waiters)
-
- def _is_min_pool_size_satisfied(self, delta=0):
- if self._terminating:
- return True
- return self._active_count + delta >= self._min_pool_size
-
- def _destroy(self, session, reason):
- self._logger.debug("Requested session destroy: %s, reason: %s", session, reason)
- with self._lock:
- tracing.trace(self.tracer, {"destroy.reason": reason})
- self._active_count -= 1
- self._logger.debug(
- "Session %s is no longer active. Current active count %d.",
- session,
- self._active_count,
- )
- cnt_waiters = len(self._waiters)
- if cnt_waiters > 0:
- self._logger.debug(
- "In flight waiters: %d, preparing session %s replacement.",
- cnt_waiters,
- session,
- )
- # we have a waiter that should be replied, so we have to prepare replacement
- self._prepare(self._create())
- elif not self._is_min_pool_size_satisfied():
- self._logger.debug(
- "Current session pool size is less than %s, actual size %s",
- self._min_pool_size,
- self._active_count,
- )
- self._prepare(self._create())
-
- if session.initialized():
- session.async_delete(self._req_settings)
- self._logger.debug("Sent delete on session %s", session)
-
- def put(self, session):
- with self._lock:
- self._logger.debug("Put on session %s", session)
- if session.closing():
- self._destroy(session, "session-close")
- return False
-
- if session.pending_query():
- self._destroy(session, "pending-query")
- return False
-
- if not session.initialized() or self._should_stop.is_set():
- self._destroy(session, "not-initialized")
- # we should probably prepare replacement session here
- return False
-
- try:
- _, waiter = self._waiters.popitem(last=False)
- waiter.set_result(session)
- tracing.trace(self.tracer, {"put.to_waiter": True})
- self._logger.debug("Replying to waiter with a session %s", session)
- except KeyError:
- priority = time.time() + 10 * 60
- tracing.trace(
- self.tracer, {"put.to_pool": True, "session.new_priority": priority}
- )
- self._active_queue.put((priority, session))
-
- def _on_session_create(self, session, f):
- with self._lock:
- try:
- f.result()
- if self._initializer is None:
- return self.put(session)
- except issues.Error as e:
- self._logger.error(
- "Failed to create session. Put event to a delayed queue. Reason: %s",
- str(e),
- )
- return self._event_queue.put(lambda: self._delayed_prepare(session))
-
- except Exception as e:
- self._logger.exception(
- "Failed to create session. Put event to a delayed queue. Reason: %s",
- str(e),
- )
- return self._event_queue.put(lambda: self._delayed_prepare(session))
-
- init_f = self._tp.submit(self._initializer, session)
-
- def _on_initialize(in_f):
- try:
- in_f.result()
- self.put(session)
- except Exception:
- self._prepare(session)
-
- init_f.add_done_callback(_on_initialize)
-
- def _prepare(self, session):
- if self._should_stop.is_set():
- self._destroy(session, "session-pool-terminated")
- return
-
- with self._lock:
- self._logger.debug("Preparing session %s", session)
- if len(self._waiters) < 1 and self._is_min_pool_size_satisfied(delta=-1):
- self._logger.info("No pending waiters, will destroy session")
- return self._destroy(session, "session-useless")
-
- f = session.async_create(self._req_settings)
- f.add_done_callback(lambda _: self._on_session_create(session, _))
-
- def _waiter_cleanup(self, w):
- with self._lock:
- try:
- self._waiters.pop(w)
- except KeyError:
- return None
-
- def subscribe(self):
- with self._lock:
- try:
- _, session = self._active_queue.get(block=False)
- tracing.trace(self.tracer, {"acquire.found_free_session": True})
- return _utilities.wrap_result_in_future(session)
- except queue.Empty:
- self._logger.debug(
- "Active session queue is empty, subscribe waiter for a session"
- )
- waiter = _utilities.future()
- self._logger.debug("Subscribe waiter %s", waiter)
- if self._should_stop.is_set():
- tracing.trace(
- self.tracer,
- {
- "acquire.found_free_session": False,
- "acquire.empty_session": True,
- },
- )
- session = self._create()
- self._logger.debug(
- "Session pool is under stop, replying with empty session, %s",
- session,
- )
- waiter.set_result(session)
- return waiter
-
- waiter.add_done_callback(self._waiter_cleanup)
- self._waiters[waiter] = waiter
- if self._active_count < self._size:
- self._logger.debug(
- "Session pool is not large enough (active_count < size: %d < %d). "
- "will create a new session.",
- self._active_count,
- self._size,
- )
- tracing.trace(
- self.tracer,
- {
- "acquire.found_free_session": False,
- "acquire.creating_new_session": True,
- "session_pool.active_size": self._active_count,
- "session_pool.size": self._size,
- },
- )
- session = self._create()
- self._prepare(session)
- else:
- tracing.trace(
- self.tracer,
- {
- "acquire.found_free_session": False,
- "acquire.creating_new_session": False,
- "session_pool.active_size": self._active_count,
- "session_pool.size": self._size,
- "acquire.waiting_for_free_session": True,
- },
- )
- return waiter
-
- def unsubscribe(self, waiter):
- with self._lock:
- try:
- # at first we remove waiter from list of the waiters to ensure
- # we will not signal it right now
- self._logger.debug("Unsubscribe on waiter %s", waiter)
- self._waiters.pop(waiter)
- except KeyError:
- try:
- session = waiter.result(timeout=-1)
- self.put(session)
- except (futures.CancelledError, futures.TimeoutError):
- # future is cancelled and not signalled
- pass
-
- def _on_keep_alive(self, session, f):
- try:
- self.put(f.result())
- # additional logic should be added to check
- # current status of the session
- except issues.Error:
- self._destroy(session, "keep-alive-error")
- except Exception:
- self._destroy(session, "keep-alive-error")
-
- def acquire(self, blocking=True, timeout=None):
- waiter = self.subscribe()
- has_result = False
- if blocking:
- tracing.trace(self.tracer, {"acquire.blocking": True})
- try:
- tracing.trace(self.tracer, {"acquire.blocking.wait": True})
- session = waiter.result(timeout=timeout)
- has_result = True
- return session
- except futures.TimeoutError:
- tracing.trace(self.tracer, {"acquire.blocking.timeout": True})
- raise issues.SessionPoolEmpty("Timeout on session acquire.")
- finally:
- if not has_result:
- self.unsubscribe(waiter)
-
- else:
- tracing.trace(self.tracer, {"acquire.nonblocking": True})
- try:
- session = waiter.result(timeout=-1)
- has_result = True
- return session
- except futures.TimeoutError:
- raise issues.SessionPoolEmpty("Session pool is empty.")
- finally:
- if not has_result:
- self.unsubscribe(waiter)
-
- def events_loop(self):
- while True:
- try:
- if self._should_stop.is_set():
- break
-
- event = self._event_queue.get(timeout=self._spin_timeout)
- event()
- except StopIteration:
- break
-
- except queue.Empty:
- while True:
- if not self.send_keep_alive():
- break
-
- def send_keep_alive(self):
- session = self.pick()
- if session is None:
- return False
-
- if self._should_stop.is_set():
- self._destroy(session, "session-pool-terminated")
- return False
-
- f = session.async_keep_alive(self._req_settings)
- f.add_done_callback(lambda q: self._on_keep_alive(session, q))
- return True
diff --git a/contrib/python/ydb/py2/ydb/_tx_ctx_impl.py b/contrib/python/ydb/py2/ydb/_tx_ctx_impl.py
deleted file mode 100644
index 925d74b441..0000000000
--- a/contrib/python/ydb/py2/ydb/_tx_ctx_impl.py
+++ /dev/null
@@ -1,179 +0,0 @@
-from . import issues, _session_impl, _apis, types, convert
-import functools
-
-
-def reset_tx_id_handler(func):
- @functools.wraps(func)
- def decorator(rpc_state, response_pb, session_state, tx_state, *args, **kwargs):
- try:
- return func(
- rpc_state, response_pb, session_state, tx_state, *args, **kwargs
- )
- except issues.Error:
- tx_state.tx_id = None
- tx_state.dead = True
- raise
-
- return decorator
-
-
-def not_found_handler(func):
- @functools.wraps(func)
- def decorator(
- rpc_state, response_pb, session_state, tx_state, query, *args, **kwargs
- ):
- try:
- return func(
- rpc_state, response_pb, session_state, tx_state, query, *args, **kwargs
- )
- except issues.NotFound:
- session_state.erase(query)
- raise
-
- return decorator
-
-
-def wrap_tx_factory_handler(func):
- @functools.wraps(func)
- def decorator(session_state, tx_state, *args, **kwargs):
- if tx_state.dead:
- raise issues.PreconditionFailed(
- "Failed to perform action on broken transaction context!"
- )
- return func(session_state, tx_state, *args, **kwargs)
-
- return decorator
-
-
-@_session_impl.bad_session_handler
-@reset_tx_id_handler
-def wrap_result_on_rollback_or_commit_tx(
- rpc_state, response_pb, session_state, tx_state, tx
-):
- session_state.complete_query()
- issues._process_response(response_pb.operation)
- # transaction successfully committed or rolled back
- tx_state.tx_id = None
- return tx
-
-
-@_session_impl.bad_session_handler
-def wrap_tx_begin_response(rpc_state, response_pb, session_state, tx_state, tx):
- session_state.complete_query()
- issues._process_response(response_pb.operation)
- message = _apis.ydb_table.BeginTransactionResult()
- response_pb.operation.result.Unpack(message)
- tx_state.tx_id = message.tx_meta.id
- return tx
-
-
-@wrap_tx_factory_handler
-def begin_request_factory(session_state, tx_state):
- request = _apis.ydb_table.BeginTransactionRequest()
- request = session_state.start_query().attach_request(request)
- request.tx_settings.MergeFrom(_construct_tx_settings(tx_state))
- return request
-
-
-@wrap_tx_factory_handler
-def rollback_request_factory(session_state, tx_state):
- request = _apis.ydb_table.RollbackTransactionRequest()
- request.tx_id = tx_state.tx_id
- request = session_state.start_query().attach_request(request)
- return request
-
-
-@wrap_tx_factory_handler
-def commit_request_factory(session_state, tx_state):
- """
- Constructs commit request
- """
- request = _apis.ydb_table.CommitTransactionRequest()
- request.tx_id = tx_state.tx_id
- request = session_state.start_query().attach_request(request)
- return request
-
-
-class TxState(object):
- __slots__ = ("tx_id", "tx_mode", "dead", "initialized")
-
- def __init__(self, tx_mode):
- """
- Holds transaction context manager info
- :param tx_mode: A mode of transaction
- """
- self.tx_id = None
- self.tx_mode = tx_mode
- self.dead = False
- self.initialized = False
-
-
-def _construct_tx_settings(tx_state):
- tx_settings = _apis.ydb_table.TransactionSettings()
- mode_property = getattr(tx_settings, tx_state.tx_mode.name)
- mode_property.MergeFrom(tx_state.tx_mode.settings)
- return tx_settings
-
-
-@wrap_tx_factory_handler
-def execute_request_factory(
- session_state, tx_state, query, parameters, commit_tx, settings
-):
- data_query, query_id = session_state.lookup(query)
- parameters_types = {}
-
- if query_id is not None:
- query_pb = _apis.ydb_table.Query(id=query_id)
- parameters_types = data_query.parameters_types
- else:
- if data_query is not None:
- # client cache disabled for send query text every time
- yql_text = data_query.yql_text
- parameters_types = data_query.parameters_types
- elif isinstance(query, types.DataQuery):
- yql_text = query.yql_text
- parameters_types = query.parameters_types
- else:
- yql_text = query
- query_pb = _apis.ydb_table.Query(yql_text=yql_text)
- request = _apis.ydb_table.ExecuteDataQueryRequest(
- parameters=convert.parameters_to_pb(parameters_types, parameters)
- )
-
- if query_id is not None:
- # SDK not send query text and nothing save to cache
- keep_in_cache = False
- elif settings is not None and hasattr(settings, "keep_in_cache"):
- keep_in_cache = settings.keep_in_cache
- elif parameters:
- keep_in_cache = True
- else:
- keep_in_cache = False
-
- if keep_in_cache:
- request.query_cache_policy.keep_in_cache = True
-
- request.query.MergeFrom(query_pb)
- tx_control = _apis.ydb_table.TransactionControl()
- tx_control.commit_tx = commit_tx
- if tx_state.tx_id is not None:
- tx_control.tx_id = tx_state.tx_id
- else:
- tx_control.begin_tx.MergeFrom(_construct_tx_settings(tx_state))
- request.tx_control.MergeFrom(tx_control)
- request = session_state.start_query().attach_request(request)
- return request
-
-
-@_session_impl.bad_session_handler
-@reset_tx_id_handler
-@not_found_handler
-def wrap_result_and_tx_id(rpc_state, response_pb, session_state, tx_state, query):
- session_state.complete_query()
- issues._process_response(response_pb.operation)
- message = _apis.ydb_table.ExecuteQueryResult()
- response_pb.operation.result.Unpack(message)
- if message.query_meta.id:
- session_state.keep(query, message.query_meta.id)
- tx_state.tx_id = None if not message.tx_meta.id else message.tx_meta.id
- return convert.ResultSets(message.result_sets, session_state.table_client_settings)
diff --git a/contrib/python/ydb/py2/ydb/_utilities.py b/contrib/python/ydb/py2/ydb/_utilities.py
deleted file mode 100644
index 32419b1bf9..0000000000
--- a/contrib/python/ydb/py2/ydb/_utilities.py
+++ /dev/null
@@ -1,161 +0,0 @@
-# -*- coding: utf-8 -*-
-import six
-import codecs
-from concurrent import futures
-import functools
-import hashlib
-import collections
-from . import ydb_version
-
-try:
- from . import interceptor
-except ImportError:
- interceptor = None
-
-
-_grpcs_protocol = "grpcs://"
-_grpc_protocol = "grpc://"
-
-
-def wrap_result_in_future(result):
- f = futures.Future()
- f.set_result(result)
- return f
-
-
-def wrap_exception_in_future(exc):
- f = futures.Future()
- f.set_exception(exc)
- return f
-
-
-def future():
- return futures.Future()
-
-
-def x_ydb_sdk_build_info_header():
- return ("x-ydb-sdk-build-info", "ydb-python-sdk/" + ydb_version.VERSION)
-
-
-def is_secure_protocol(endpoint):
- return endpoint.startswith("grpcs://")
-
-
-def wrap_endpoint(endpoint):
- if endpoint.startswith(_grpcs_protocol):
- return endpoint[len(_grpcs_protocol) :]
- if endpoint.startswith(_grpc_protocol):
- return endpoint[len(_grpc_protocol) :]
- return endpoint
-
-
-def parse_connection_string(connection_string):
- cs = connection_string
- if not cs.startswith(_grpc_protocol) and not cs.startswith(_grpcs_protocol):
- # default is grpcs
- cs = _grpcs_protocol + cs
-
- p = six.moves.urllib.parse.urlparse(connection_string)
- b = six.moves.urllib.parse.parse_qs(p.query)
- database = b.get("database", [])
- assert len(database) > 0
-
- return p.scheme + "://" + p.netloc, database[0]
-
-
-# Decorator that ensures no exceptions are leaked from decorated async call
-def wrap_async_call_exceptions(f):
- @functools.wraps(f)
- def decorator(*args, **kwargs):
- try:
- return f(*args, **kwargs)
- except Exception as e:
- return wrap_exception_in_future(e)
-
- return decorator
-
-
-def get_query_hash(yql_text):
- try:
- return hashlib.sha256(
- six.text_type(yql_text, "utf-8").encode("utf-8")
- ).hexdigest()
- except TypeError:
- return hashlib.sha256(six.text_type(yql_text).encode("utf-8")).hexdigest()
-
-
-class LRUCache(object):
- def __init__(self, capacity=1000):
- self.items = collections.OrderedDict()
- self.capacity = capacity
-
- def put(self, key, value):
- self.items[key] = value
- while len(self.items) > self.capacity:
- self.items.popitem(last=False)
-
- def get(self, key, _default):
- if key not in self.items:
- return _default
- value = self.items.pop(key)
- self.items[key] = value
- return value
-
- def erase(self, key):
- self.items.pop(key)
-
-
-def from_bytes(val):
- """
- Translates value into valid utf8 string
- :param val: A value to translate
- :return: A valid utf8 string
- """
- try:
- return codecs.decode(val, "utf8")
- except (UnicodeEncodeError, TypeError):
- return val
-
-
-class AsyncResponseIterator(object):
- def __init__(self, it, wrapper):
- self.it = it
- self.wrapper = wrapper
-
- def cancel(self):
- self.it.cancel()
- return self
-
- def __iter__(self):
- return self
-
- def _next(self):
- return interceptor.operate_async_stream_call(self.it, self.wrapper)
-
- def next(self):
- return self._next()
-
- def __next__(self):
- return self._next()
-
-
-class SyncResponseIterator(object):
- def __init__(self, it, wrapper):
- self.it = it
- self.wrapper = wrapper
-
- def cancel(self):
- self.it.cancel()
- return self
-
- def __iter__(self):
- return self
-
- def _next(self):
- return self.wrapper(next(self.it))
-
- def next(self):
- return self._next()
-
- def __next__(self):
- return self._next()
diff --git a/contrib/python/ydb/py2/ydb/auth_helpers.py b/contrib/python/ydb/py2/ydb/auth_helpers.py
deleted file mode 100644
index 5d889555df..0000000000
--- a/contrib/python/ydb/py2/ydb/auth_helpers.py
+++ /dev/null
@@ -1,57 +0,0 @@
-# -*- coding: utf-8 -*-
-import os
-
-from . import credentials, tracing
-import warnings
-
-
-def read_bytes(f):
- with open(f, "rb") as fr:
- return fr.read()
-
-
-def load_ydb_root_certificate():
- path = os.getenv("YDB_SSL_ROOT_CERTIFICATES_FILE", None)
- if path is not None and os.path.exists(path):
- return read_bytes(path)
- return None
-
-
-def construct_credentials_from_environ(tracer=None):
- tracer = tracer if tracer is not None else tracing.Tracer(None)
- warnings.warn(
- "using construct_credentials_from_environ method for credentials instantiation is deprecated and will be "
- "removed in the future major releases. Please instantialize credentials by default or provide correct credentials "
- "instance to the Driver."
- )
-
- # dynamically import required authentication libraries
- if (
- os.getenv("USE_METADATA_CREDENTIALS") is not None
- and int(os.getenv("USE_METADATA_CREDENTIALS")) == 1
- ):
- import ydb.iam
-
- tracing.trace(tracer, {"credentials.metadata": True})
- return ydb.iam.MetadataUrlCredentials()
-
- if os.getenv("YDB_TOKEN") is not None:
- tracing.trace(tracer, {"credentials.access_token": True})
- return credentials.AuthTokenCredentials(os.getenv("YDB_TOKEN"))
-
- if os.getenv("SA_KEY_FILE") is not None:
-
- import ydb.iam
-
- tracing.trace(tracer, {"credentials.sa_key_file": True})
- root_certificates_file = os.getenv("SSL_ROOT_CERTIFICATES_FILE", None)
- iam_channel_credentials = {}
- if root_certificates_file is not None:
- iam_channel_credentials = {
- "root_certificates": read_bytes(root_certificates_file)
- }
- return ydb.iam.ServiceAccountCredentials.from_file(
- os.getenv("SA_KEY_FILE"),
- iam_channel_credentials=iam_channel_credentials,
- iam_endpoint=os.getenv("IAM_ENDPOINT", "iam.api.cloud.yandex.net:443"),
- )
diff --git a/contrib/python/ydb/py2/ydb/connection.py b/contrib/python/ydb/py2/ydb/connection.py
deleted file mode 100644
index 95db084a3c..0000000000
--- a/contrib/python/ydb/py2/ydb/connection.py
+++ /dev/null
@@ -1,550 +0,0 @@
-# -*- coding: utf-8 -*-
-import logging
-import copy
-from concurrent import futures
-import uuid
-import threading
-import collections
-
-from google.protobuf import text_format
-import grpc
-from . import issues, _apis, _utilities
-from . import default_pem
-
-_stubs_list = (
- _apis.TableService.Stub,
- _apis.SchemeService.Stub,
- _apis.DiscoveryService.Stub,
- _apis.CmsService.Stub,
-)
-
-logger = logging.getLogger(__name__)
-DEFAULT_TIMEOUT = 600
-YDB_DATABASE_HEADER = "x-ydb-database"
-YDB_TRACE_ID_HEADER = "x-ydb-trace-id"
-YDB_REQUEST_TYPE_HEADER = "x-ydb-request-type"
-
-
-def _message_to_string(message):
- """
- Constructs a string representation of provided message or generator
- :param message: A protocol buffer or generator instance
- :return: A string
- """
- try:
- return text_format.MessageToString(message, as_one_line=True)
- except Exception:
- return str(message)
-
-
-def _log_response(rpc_state, response):
- """
- Writes a message with response into debug logs
- :param rpc_state: A state of rpc
- :param response: A received response
- :return: None
- """
- if logger.isEnabledFor(logging.DEBUG):
- logger.debug("%s: response = { %s }", rpc_state, _message_to_string(response))
-
-
-def _log_request(rpc_state, request):
- """
- Writes a message with request into debug logs
- :param rpc_state: An id of request
- :param request: A received response
- :return: None
- """
- if logger.isEnabledFor(logging.DEBUG):
- logger.debug("%s: request = { %s }", rpc_state, _message_to_string(request))
-
-
-def _rpc_error_handler(rpc_state, rpc_error, on_disconnected=None):
- """
- RPC call error handler, that translates gRPC error into YDB issue
- :param rpc_state: A state of rpc
- :param rpc_error: an underlying rpc error to handle
- :param on_disconnected: a handler to call on disconnected connection
- """
- logger.info("%s: received error, %s", rpc_state, rpc_error)
- if isinstance(rpc_error, grpc.Call):
- if rpc_error.code() == grpc.StatusCode.UNAUTHENTICATED:
- return issues.Unauthenticated(rpc_error.details())
- elif rpc_error.code() == grpc.StatusCode.DEADLINE_EXCEEDED:
- return issues.DeadlineExceed("Deadline exceeded on request")
- elif rpc_error.code() == grpc.StatusCode.UNIMPLEMENTED:
- return issues.Unimplemented(
- "Method or feature is not implemented on server!"
- )
-
- logger.debug("%s: unhandled rpc error, disconnecting channel", rpc_state)
- if on_disconnected is not None:
- on_disconnected()
-
- return issues.ConnectionLost("Rpc error, reason %s" % str(rpc_error))
-
-
-def _on_response_callback(
- rpc_state, call_state_unref, wrap_result=None, on_disconnected=None, wrap_args=()
-):
- """
- Callback to be executed on received RPC response
- :param rpc_state: A name of RPC
- :param wrap_result: A callable that wraps received response
- :param on_disconnected: A handler to executed on disconnected channel
- :param wrap_args: An arguments to be passed into wrap result callable
- :return: None
- """
- try:
- logger.debug("%s: on response callback started", rpc_state)
- response = rpc_state.rendezvous.result()
- _log_response(rpc_state, response)
- response = (
- response
- if wrap_result is None
- else wrap_result(rpc_state, response, *wrap_args)
- )
- rpc_state.result_future.set_result(response)
- logger.debug("%s: on response callback success", rpc_state)
- except grpc.FutureCancelledError as e:
- logger.debug("%s: request execution cancelled", rpc_state)
- if not rpc_state.result_future.cancelled():
- rpc_state.result_future.set_exception(e)
-
- except grpc.RpcError as rpc_call_error:
- rpc_state.result_future.set_exception(
- _rpc_error_handler(rpc_state, rpc_call_error, on_disconnected)
- )
-
- except issues.Error as e:
- logger.info("%s: received exception, %s", rpc_state, str(e))
- rpc_state.result_future.set_exception(e)
-
- except Exception as e:
- logger.error("%s: received exception, %s", rpc_state, str(e))
- rpc_state.result_future.set_exception(issues.ConnectionLost(str(e)))
-
- call_state_unref()
-
-
-def _construct_metadata(driver_config, settings):
- """
- Translates request settings into RPC metadata
- :param driver_config: A driver config
- :param settings: An instance of BaseRequestSettings
- :return: RPC metadata
- """
- metadata = []
- if driver_config.database is not None:
- metadata.append((YDB_DATABASE_HEADER, driver_config.database))
-
- need_rpc_auth = getattr(settings, "need_rpc_auth", True)
- if driver_config.credentials is not None and need_rpc_auth:
- metadata.extend(driver_config.credentials.auth_metadata())
-
- if settings is not None:
- if settings.trace_id is not None:
- metadata.append((YDB_TRACE_ID_HEADER, settings.trace_id))
- if settings.request_type is not None:
- metadata.append((YDB_REQUEST_TYPE_HEADER, settings.request_type))
- metadata.extend(getattr(settings, "headers", []))
-
- metadata.append(_utilities.x_ydb_sdk_build_info_header())
- return metadata
-
-
-def _get_request_timeout(settings):
- """
- Extracts RPC timeout from request settings
- :param settings: an instance of BaseRequestSettings
- :return: timeout of RPC execution
- """
- if settings is None or settings.timeout is None:
- return DEFAULT_TIMEOUT
- return settings.timeout
-
-
-class EndpointOptions(object):
- __slots__ = ("ssl_target_name_override", "node_id")
-
- def __init__(self, ssl_target_name_override=None, node_id=None):
- self.ssl_target_name_override = ssl_target_name_override
- self.node_id = node_id
-
-
-def _construct_channel_options(driver_config, endpoint_options=None):
- """
- Constructs gRPC channel initialization options
- :param driver_config: A driver config instance
- :param endpoint_options: Endpoint options
- :return: A channel initialization options
- """
- _max_message_size = 64 * 10**6
- _default_connect_options = [
- ("grpc.max_receive_message_length", _max_message_size),
- ("grpc.max_send_message_length", _max_message_size),
- ("grpc.primary_user_agent", driver_config.primary_user_agent),
- (
- "grpc.lb_policy_name",
- getattr(driver_config, "grpc_lb_policy_name", "round_robin"),
- ),
- ]
- if driver_config.grpc_keep_alive_timeout is not None:
- _default_connect_options.extend(
- [
- ("grpc.keepalive_time_ms", driver_config.grpc_keep_alive_timeout >> 3),
- ("grpc.keepalive_timeout_ms", driver_config.grpc_keep_alive_timeout),
- ("grpc.http2.max_pings_without_data", 0),
- ("grpc.keepalive_permit_without_calls", 0),
- ]
- )
- if endpoint_options is not None:
- if endpoint_options.ssl_target_name_override:
- _default_connect_options.append(
- (
- "grpc.ssl_target_name_override",
- endpoint_options.ssl_target_name_override,
- )
- )
- if driver_config.channel_options is None:
- return _default_connect_options
- channel_options = copy.deepcopy(driver_config.channel_options)
- custom_options_keys = set(i[0] for i in driver_config.channel_options)
- for item in filter(
- lambda x: x[0] not in custom_options_keys, _default_connect_options
- ):
- channel_options.append(item)
- return channel_options
-
-
-class _RpcState(object):
- __slots__ = (
- "rpc",
- "request_id",
- "result_future",
- "rpc_name",
- "endpoint",
- "rendezvous",
- "metadata_kv",
- "endpoint_key",
- )
-
- def __init__(self, stub_instance, rpc_name, endpoint, endpoint_key):
- """Stores all RPC related data"""
- self.rpc_name = rpc_name
- self.rpc = getattr(stub_instance, rpc_name)
- self.request_id = uuid.uuid4()
- self.endpoint = endpoint
- self.rendezvous = None
- self.metadata_kv = None
- self.endpoint_key = endpoint_key
-
- def __str__(self):
- return "RpcState(%s, %s, %s)" % (self.rpc_name, self.request_id, self.endpoint)
-
- def __call__(self, *args, **kwargs):
- """Execute a RPC."""
- try:
- response, rendezvous = self.rpc.with_call(*args, **kwargs)
- self.rendezvous = rendezvous
- return response
- except AttributeError:
- return self.rpc(*args, **kwargs)
-
- def trailing_metadata(self):
- """Trailing metadata of the call."""
- if self.metadata_kv is None:
-
- self.metadata_kv = collections.defaultdict(set)
- for metadatum in self.rendezvous.trailing_metadata():
- self.metadata_kv[metadatum.key].add(metadatum.value)
-
- return self.metadata_kv
-
- def future(self, *args, **kwargs):
- self.rendezvous = self.rpc.future(*args, **kwargs)
- self.result_future = futures.Future()
-
- def _cancel_callback(f):
- """forwards cancel to gPRC future"""
- if f.cancelled():
- self.rendezvous.cancel()
-
- self.rendezvous.add_done_callback(_cancel_callback)
- return self.rendezvous, self.result_future
-
-
-_nanos_in_second = 10**9
-
-
-def _set_duration(duration_value, seconds_float):
- duration_value.seconds = int(seconds_float)
- duration_value.nanos = int((seconds_float - int(seconds_float)) * _nanos_in_second)
- return duration_value
-
-
-def _set_server_timeouts(request, settings, default_value):
- if not hasattr(request, "operation_params"):
- return
-
- operation_timeout = getattr(settings, "operation_timeout", default_value)
- operation_timeout = (
- default_value if operation_timeout is None else operation_timeout
- )
- cancel_after = getattr(settings, "cancel_after", default_value)
- cancel_after = default_value if cancel_after is None else cancel_after
- _set_duration(request.operation_params.operation_timeout, operation_timeout)
- _set_duration(request.operation_params.cancel_after, cancel_after)
-
-
-def channel_factory(
- endpoint, driver_config, channel_provider=None, endpoint_options=None
-):
- channel_provider = channel_provider if channel_provider is not None else grpc
- options = _construct_channel_options(driver_config, endpoint_options)
- logger.debug("Channel options: {}".format(options))
-
- if driver_config.root_certificates is None and not driver_config.secure_channel:
- return channel_provider.insecure_channel(
- endpoint, options, compression=getattr(driver_config, "compression", None)
- )
-
- root_certificates = driver_config.root_certificates
- if root_certificates is None:
- root_certificates = default_pem.load_default_pem()
- credentials = grpc.ssl_channel_credentials(
- root_certificates, driver_config.private_key, driver_config.certificate_chain
- )
- return channel_provider.secure_channel(
- endpoint,
- credentials,
- options,
- compression=getattr(driver_config, "compression", None),
- )
-
-
-class EndpointKey(object):
- __slots__ = ("endpoint", "node_id")
-
- def __init__(self, endpoint, node_id):
- self.endpoint = endpoint
- self.node_id = node_id
-
-
-class Connection(object):
- __slots__ = (
- "endpoint",
- "_channel",
- "_call_states",
- "_stub_instances",
- "_driver_config",
- "_cleanup_callbacks",
- "__weakref__",
- "lock",
- "calls",
- "closing",
- "endpoint_key",
- "node_id",
- )
-
- def __init__(self, endpoint, driver_config=None, endpoint_options=None):
- """
- Object that wraps gRPC channel and encapsulates gRPC request execution logic
- :param endpoint: endpoint to connect (in pattern host:port), constructed by user or
- discovered by the YDB endpoint discovery mechanism
- :param driver_config: A driver config instance to be used for RPC call interception
- """
- global _stubs_list
- self.endpoint = endpoint
- self.node_id = getattr(endpoint_options, "node_id", None)
- self.endpoint_key = EndpointKey(
- endpoint, getattr(endpoint_options, "node_id", None)
- )
- self._channel = channel_factory(
- self.endpoint, driver_config, endpoint_options=endpoint_options
- )
- self._driver_config = driver_config
- self._call_states = {}
- self._stub_instances = {}
- self._cleanup_callbacks = []
- # pre-initialize stubs
- for stub in _stubs_list:
- self._stub_instances[stub] = stub(self._channel)
- self.lock = threading.RLock()
- self.calls = 0
- self.closing = False
-
- def _prepare_stub_instance(self, stub):
- if stub not in self._stub_instances:
- self._stub_instances[stub] = stub(self._channel)
-
- def add_cleanup_callback(self, callback):
- self._cleanup_callbacks.append(callback)
-
- def _prepare_call(self, stub, rpc_name, request, settings):
- timeout, metadata = _get_request_timeout(settings), _construct_metadata(
- self._driver_config, settings
- )
- _set_server_timeouts(request, settings, timeout)
- self._prepare_stub_instance(stub)
- rpc_state = _RpcState(
- self._stub_instances[stub], rpc_name, self.endpoint, self.endpoint_key
- )
- logger.debug("%s: creating call state", rpc_state)
- with self.lock:
- if self.closing:
- raise issues.ConnectionLost("Couldn't start call")
- self.calls += 1
- self._call_states[rpc_state.request_id] = rpc_state
- # Call successfully prepared and registered
- _log_request(rpc_state, request)
- return rpc_state, timeout, metadata
-
- def _finish_call(self, call_state):
- with self.lock:
- self.calls -= 1
- self._call_states.pop(call_state.request_id, None)
- # Call successfully finished
- if self.closing and self.calls == 0:
- # Channel is closing and we have to destroy channel
- self.destroy()
-
- def future(
- self,
- request,
- stub,
- rpc_name,
- wrap_result=None,
- settings=None,
- wrap_args=(),
- on_disconnected=None,
- ):
- """
- Sends request constructed by client
- :param request: A request constructed by client
- :param stub: A stub instance to wrap channel
- :param rpc_name: A name of RPC to be executed
- :param wrap_result: A callable that intercepts call and wraps received response
- :param settings: An instance of BaseRequestSettings that can be used
- for RPC metadata construction
- :param on_disconnected: A callable to be executed when underlying channel becomes disconnected
- :param wrap_args: And arguments to be passed into wrap_result callable
- :return: A future of computation
- """
- rpc_state, timeout, metadata = self._prepare_call(
- stub, rpc_name, request, settings
- )
- rendezvous, result_future = rpc_state.future(
- request,
- timeout,
- metadata,
- compression=getattr(settings, "compression", None),
- )
- rendezvous.add_done_callback(
- lambda resp_future: _on_response_callback(
- rpc_state,
- lambda: self._finish_call(rpc_state),
- wrap_result,
- on_disconnected,
- wrap_args,
- )
- )
- return result_future
-
- def __call__(
- self,
- request,
- stub,
- rpc_name,
- wrap_result=None,
- settings=None,
- wrap_args=(),
- on_disconnected=None,
- ):
- """
- Synchronously sends request constructed by client library
- :param request: A request constructed by client
- :param stub: A stub instance to wrap channel
- :param rpc_name: A name of RPC to be executed
- :param wrap_result: A callable that intercepts call and wraps received response
- :param settings: An instance of BaseRequestSettings that can be used
- for RPC metadata construction
- :param on_disconnected: A callable to be executed when underlying channel becomes disconnected
- :param wrap_args: And arguments to be passed into wrap_result callable
- :return: A result of computation
- """
- rpc_state, timeout, metadata = self._prepare_call(
- stub, rpc_name, request, settings
- )
- try:
- response = rpc_state(
- request,
- timeout,
- metadata,
- compression=getattr(settings, "compression", None),
- )
- _log_response(rpc_state, response)
- return (
- response
- if wrap_result is None
- else wrap_result(rpc_state, response, *wrap_args)
- )
- except grpc.RpcError as rpc_error:
- raise _rpc_error_handler(rpc_state, rpc_error, on_disconnected)
- finally:
- self._finish_call(rpc_state)
-
- @classmethod
- def ready_factory(
- cls, endpoint, driver_config, ready_timeout=10, endpoint_options=None
- ):
- candidate = cls(endpoint, driver_config, endpoint_options=endpoint_options)
- ready_future = candidate.ready_future()
- try:
- ready_future.result(timeout=ready_timeout)
- return candidate
- except grpc.FutureTimeoutError:
- ready_future.cancel()
- candidate.close()
- return None
-
- except Exception:
- candidate.close()
- return None
-
- def __enter__(self):
- return self
-
- def __exit__(self, exc_type, exc_val, exc_tb):
- self.close()
-
- def close(self):
- """
- Closes the underlying gRPC channel
- :return: None
- """
- logger.info("Closing channel for endpoint %s", self.endpoint)
- with self.lock:
- self.closing = True
-
- for callback in self._cleanup_callbacks:
- callback(self)
-
- # potentially we should cancel in-flight calls here but currently
- # it is not required since gRPC can successfully cancel these calls manually.
-
- if self.calls == 0:
- # everything is cancelled/completed and channel can be destroyed
- self.destroy()
-
- def destroy(self):
- if hasattr(self, "_channel") and hasattr(self._channel, "close"):
- self._channel.close()
-
- def ready_future(self):
- """
- Creates a future that tracks underlying gRPC channel is ready
- :return: A Future object that matures when the underlying channel is ready
- to receive request
- """
- return grpc.channel_ready_future(self._channel)
diff --git a/contrib/python/ydb/py2/ydb/convert.py b/contrib/python/ydb/py2/ydb/convert.py
deleted file mode 100644
index 97d51cf1b6..0000000000
--- a/contrib/python/ydb/py2/ydb/convert.py
+++ /dev/null
@@ -1,514 +0,0 @@
-# -*- coding: utf-8 -*-
-import decimal
-from google.protobuf import struct_pb2
-import six
-
-from . import issues, types, _apis
-
-
-_SHIFT_BIT_COUNT = 64
-_SHIFT = 2**64
-_SIGN_BIT = 2**63
-_DecimalNanRepr = 10**35 + 1
-_DecimalInfRepr = 10**35
-_DecimalSignedInfRepr = -(10**35)
-_primitive_type_by_id = {}
-_default_allow_truncated_result = True
-
-
-def _initialize():
- for pt in types.PrimitiveType:
- _primitive_type_by_id[pt._idn_] = pt
-
-
-_initialize()
-
-
-class _DotDict(dict):
- def __init__(self, *args, **kwargs):
- super(_DotDict, self).__init__(*args, **kwargs)
-
- def __getattr__(self, item):
- return self[item]
-
-
-def _is_decimal_signed(hi_value):
- return (hi_value & _SIGN_BIT) == _SIGN_BIT
-
-
-def _pb_to_decimal(type_pb, value_pb, table_client_settings):
- hi = (
- (value_pb.high_128 - (1 << _SHIFT_BIT_COUNT))
- if _is_decimal_signed(value_pb.high_128)
- else value_pb.high_128
- )
- int128_value = value_pb.low_128 + (hi << _SHIFT_BIT_COUNT)
- if int128_value == _DecimalNanRepr:
- return decimal.Decimal("Nan")
- elif int128_value == _DecimalInfRepr:
- return decimal.Decimal("Inf")
- elif int128_value == _DecimalSignedInfRepr:
- return decimal.Decimal("-Inf")
- return decimal.Decimal(int128_value) / decimal.Decimal(
- 10**type_pb.decimal_type.scale
- )
-
-
-def _pb_to_primitive(type_pb, value_pb, table_client_settings):
- return _primitive_type_by_id.get(type_pb.type_id).get_value(
- value_pb, table_client_settings
- )
-
-
-def _pb_to_optional(type_pb, value_pb, table_client_settings):
- if value_pb.WhichOneof("value") == "null_flag_value":
- return None
- if value_pb.WhichOneof("value") == "nested_value":
- return _to_native_value(
- type_pb.optional_type.item, value_pb.nested_value, table_client_settings
- )
- return _to_native_value(type_pb.optional_type.item, value_pb, table_client_settings)
-
-
-def _pb_to_list(type_pb, value_pb, table_client_settings):
- return [
- _to_native_value(
- type_pb.list_type.item, value_proto_item, table_client_settings
- )
- for value_proto_item in value_pb.items
- ]
-
-
-def _pb_to_tuple(type_pb, value_pb, table_client_settings):
- return tuple(
- _to_native_value(item_type, item_value, table_client_settings)
- for item_type, item_value in six.moves.zip(
- type_pb.tuple_type.elements, value_pb.items
- )
- )
-
-
-def _pb_to_dict(type_pb, value_pb, table_client_settings):
- result = {}
- for kv_pair in value_pb.pairs:
- key = _to_native_value(
- type_pb.dict_type.key, kv_pair.key, table_client_settings
- )
- payload = _to_native_value(
- type_pb.dict_type.payload, kv_pair.payload, table_client_settings
- )
- result[key] = payload
- return result
-
-
-class _Struct(_DotDict):
- pass
-
-
-def _pb_to_struct(type_pb, value_pb, table_client_settings):
- result = _Struct()
- for member, item in six.moves.zip(type_pb.struct_type.members, value_pb.items):
- result[member.name] = _to_native_value(member.type, item, table_client_settings)
- return result
-
-
-def _pb_to_void(type_pb, value_pb, table_client_settings):
- return None
-
-
-_to_native_map = {
- "type_id": _pb_to_primitive,
- "decimal_type": _pb_to_decimal,
- "optional_type": _pb_to_optional,
- "list_type": _pb_to_list,
- "tuple_type": _pb_to_tuple,
- "dict_type": _pb_to_dict,
- "struct_type": _pb_to_struct,
- "void_type": _pb_to_void,
- "empty_list_type": _pb_to_list,
- "empty_dict_type": _pb_to_dict,
-}
-
-
-def _to_native_value(type_pb, value_pb, table_client_settings=None):
- return _to_native_map.get(type_pb.WhichOneof("type"))(
- type_pb, value_pb, table_client_settings
- )
-
-
-def _decimal_to_int128(value_type, value):
- if value.is_nan():
- return _DecimalNanRepr
- elif value.is_infinite():
- if value.is_signed():
- return _DecimalSignedInfRepr
- return _DecimalInfRepr
-
- sign, digits, exponent = value.as_tuple()
- int128_value = 0
- digits_count = 0
- for digit in digits:
- int128_value *= 10
- int128_value += digit
- digits_count += 1
-
- if value_type.decimal_type.scale + exponent < 0:
- raise issues.GenericError("Couldn't parse decimal value, exponent is too large")
-
- for _ in range(value_type.decimal_type.scale + exponent):
- int128_value *= 10
- digits_count += 1
-
- if digits_count > value_type.decimal_type.precision + value_type.decimal_type.scale:
- raise issues.GenericError("Couldn't parse decimal value, digits count > 35")
-
- if sign:
- int128_value *= -1
-
- return int128_value
-
-
-def _decimal_to_pb(value_type, value):
- value_pb = _apis.ydb_value.Value()
- int128_value = _decimal_to_int128(value_type, value)
- if int128_value < 0:
- value_pb.high_128 = (int128_value >> _SHIFT_BIT_COUNT) + (1 << _SHIFT_BIT_COUNT)
- int128_value -= (int128_value >> _SHIFT_BIT_COUNT) << _SHIFT_BIT_COUNT
- else:
- value_pb.high_128 = int128_value >> _SHIFT_BIT_COUNT
- int128_value -= value_pb.high_128 << _SHIFT_BIT_COUNT
- value_pb.low_128 = int128_value
- return value_pb
-
-
-def _primitive_to_pb(type_pb, value):
- value_pb = _apis.ydb_value.Value()
- data_type = _primitive_type_by_id.get(type_pb.type_id)
- data_type.set_value(value_pb, value)
- return value_pb
-
-
-def _optional_to_pb(type_pb, value):
- if value is None:
- return _apis.ydb_value.Value(null_flag_value=struct_pb2.NULL_VALUE)
- return _from_native_value(type_pb.optional_type.item, value)
-
-
-def _list_to_pb(type_pb, value):
- value_pb = _apis.ydb_value.Value()
- for element in value:
- value_item_proto = value_pb.items.add()
- value_item_proto.MergeFrom(_from_native_value(type_pb.list_type.item, element))
- return value_pb
-
-
-def _tuple_to_pb(type_pb, value):
- value_pb = _apis.ydb_value.Value()
- for element_type, element_value in six.moves.zip(
- type_pb.tuple_type.elements, value
- ):
- value_item_proto = value_pb.items.add()
- value_item_proto.MergeFrom(_from_native_value(element_type, element_value))
- return value_pb
-
-
-def _dict_to_pb(type_pb, value):
- value_pb = _apis.ydb_value.Value()
- for key, payload in value.items():
- kv_pair = value_pb.pairs.add()
- kv_pair.key.MergeFrom(_from_native_value(type_pb.dict_type.key, key))
- if payload:
- kv_pair.payload.MergeFrom(
- _from_native_value(type_pb.dict_type.payload, payload)
- )
- return value_pb
-
-
-def _struct_to_pb(type_pb, value):
- value_pb = _apis.ydb_value.Value()
- for member in type_pb.struct_type.members:
- value_item_proto = value_pb.items.add()
- value_item = (
- value[member.name]
- if isinstance(value, dict)
- else getattr(value, member.name)
- )
- value_item_proto.MergeFrom(_from_native_value(member.type, value_item))
- return value_pb
-
-
-_from_native_map = {
- "type_id": _primitive_to_pb,
- "decimal_type": _decimal_to_pb,
- "optional_type": _optional_to_pb,
- "list_type": _list_to_pb,
- "tuple_type": _tuple_to_pb,
- "dict_type": _dict_to_pb,
- "struct_type": _struct_to_pb,
-}
-
-
-def _decimal_type_to_native(type_pb):
- return types.DecimalType(type_pb.decimal_type.precision, type_pb.decimal_type.scale)
-
-
-def _optional_type_to_native(type_pb):
- return types.OptionalType(type_to_native(type_pb.optional_type.item))
-
-
-def _primitive_type_to_native(type_pb):
- return _primitive_type_by_id.get(type_pb.type_id)
-
-
-def _null_type_factory(type_pb):
- return types.NullType()
-
-
-_type_to_native_map = {
- "optional_type": _optional_type_to_native,
- "type_id": _primitive_type_to_native,
- "decimal_type": _decimal_type_to_native,
- "null_type": _null_type_factory,
-}
-
-
-def type_to_native(type_pb):
- return _type_to_native_map.get(type_pb.WhichOneof("type"))(type_pb)
-
-
-def _from_native_value(type_pb, value):
- return _from_native_map.get(type_pb.WhichOneof("type"))(type_pb, value)
-
-
-def to_typed_value_from_native(type_pb, value):
- typed_value = _apis.ydb_value.TypedValue()
- typed_value.type.MergeFrom(type_pb)
- typed_value.value.MergeFrom(from_native_value(type_pb, value))
- return typed_value
-
-
-def parameters_to_pb(parameters_types, parameters_values):
- if parameters_values is None or not parameters_values:
- return {}
-
- param_values_pb = {}
- for name, type_pb in six.iteritems(parameters_types):
- result = _apis.ydb_value.TypedValue()
- ttype = type_pb
- if isinstance(type_pb, types.AbstractTypeBuilder):
- ttype = type_pb.proto
- elif isinstance(type_pb, types.PrimitiveType):
- ttype = type_pb.proto
- result.type.MergeFrom(ttype)
- result.value.MergeFrom(_from_native_value(ttype, parameters_values[name]))
- param_values_pb[name] = result
- return param_values_pb
-
-
-def _unwrap_optionality(column):
- c_type = column.type
- current_type = c_type.WhichOneof("type")
- while current_type == "optional_type":
- c_type = c_type.optional_type.item
- current_type = c_type.WhichOneof("type")
- return _to_native_map.get(current_type), c_type
-
-
-class _ResultSet(object):
- __slots__ = ("columns", "rows", "truncated", "snapshot")
-
- def __init__(self, columns, rows, truncated, snapshot=None):
- self.columns = columns
- self.rows = rows
- self.truncated = truncated
- self.snapshot = snapshot
-
- @classmethod
- def from_message(cls, message, table_client_settings=None, snapshot=None):
- rows = []
- # prepare columnn parsers before actuall parsing
- column_parsers = []
- if len(message.rows) > 0:
- for column in message.columns:
- column_parsers.append(_unwrap_optionality(column))
-
- for row_proto in message.rows:
- row = _Row(message.columns)
- for column, value, column_info in six.moves.zip(
- message.columns, row_proto.items, column_parsers
- ):
- v_type = value.WhichOneof("value")
- if v_type == "null_flag_value":
- row[column.name] = None
- continue
-
- while v_type == "nested_value":
- value = value.nested_value
- v_type = value.WhichOneof("value")
-
- column_parser, unwrapped_type = column_info
- row[column.name] = column_parser(
- unwrapped_type, value, table_client_settings
- )
- rows.append(row)
- return cls(message.columns, rows, message.truncated, snapshot)
-
- @classmethod
- def lazy_from_message(cls, message, table_client_settings=None, snapshot=None):
- rows = _LazyRows(message.rows, table_client_settings, message.columns)
- return cls(message.columns, rows, message.truncated, snapshot)
-
-
-ResultSet = _ResultSet
-
-
-class _Row(_DotDict):
- def __init__(self, columns):
- super(_Row, self).__init__()
- self._columns = columns
-
- def __getitem__(self, key):
- if isinstance(key, int):
- return self[self._columns[key].name]
- elif isinstance(key, slice):
- return tuple(map(lambda x: self[x.name], self._columns[key]))
- else:
- return super(_Row, self).__getitem__(key)
-
-
-class _LazyRowItem:
-
- __slots__ = ["_item", "_type", "_table_client_settings", "_processed", "_parser"]
-
- def __init__(self, proto_item, proto_type, table_client_settings, parser):
- self._item = proto_item
- self._type = proto_type
- self._table_client_settings = table_client_settings
- self._processed = False
- self._parser = parser
-
- def get(self):
- if not self._processed:
-
- self._item = self._parser(
- self._type, self._item, self._table_client_settings
- )
- self._processed = True
- return self._item
-
-
-class _LazyRow(_DotDict):
- def __init__(self, columns, proto_row, table_client_settings, parsers):
- super(_LazyRow, self).__init__()
- self._columns = columns
- self._table_client_settings = table_client_settings
- for i, (column, row_item) in enumerate(
- six.moves.zip(self._columns, proto_row.items)
- ):
- super(_LazyRow, self).__setitem__(
- column.name,
- _LazyRowItem(row_item, column.type, table_client_settings, parsers[i]),
- )
-
- def __setitem__(self, key, value):
- raise NotImplementedError("Cannot insert values into lazy row")
-
- def __getitem__(self, key):
- if isinstance(key, int):
- return self[self._columns[key].name]
- elif isinstance(key, slice):
- return tuple(map(lambda x: self[x.name], self._columns[key]))
- else:
- return super(_LazyRow, self).__getitem__(key).get()
-
- def __iter__(self):
- return super(_LazyRow, self).__iter__()
-
- def __next__(self):
- return super(_LazyRow, self).__next__().get()
-
- def next(self):
- return self.__next__()
-
-
-def from_native_value(type_pb, value):
- return _from_native_value(type_pb, value)
-
-
-def to_native_value(typed_value):
- return _to_native_value(typed_value.type, typed_value.value)
-
-
-class _LazyRows:
- def __init__(self, rows, table_client_settings, columns):
- self._rows = rows
- self._parsers = [_LazyParser(columns, i) for i in range(len(columns))]
- self._table_client_settings = table_client_settings
- self._columns = columns
-
- def __len__(self):
- return len(self._rows)
-
- def fetchone(self):
- return _LazyRow(
- self._columns, self._rows[0], self._table_client_settings, self._parsers
- )
-
- def fetchmany(self, number):
- for index in range(min(len(self), number)):
- yield _LazyRow(
- self._columns,
- self._rows[index],
- self._table_client_settings,
- self._parsers,
- )
-
- def __iter__(self):
- for row in self.fetchmany(len(self)):
- yield row
-
- def fetchall(self):
- for row in self:
- yield row
-
-
-class _LazyParser:
- __slots__ = ["_columns", "_column_index", "_prepared"]
-
- def __init__(self, columns, column_index):
- self._columns = columns
- self._column_index = column_index
- self._prepared = None
-
- def __call__(self, *args, **kwargs):
- if self._prepared is None:
- self._prepared = _to_native_map.get(
- self._columns[self._column_index].type.WhichOneof("type")
- )
- return self._prepared(*args, **kwargs)
-
-
-class ResultSets(list):
- def __init__(self, result_sets_pb, table_client_settings=None):
- make_lazy = (
- False
- if table_client_settings is None
- else table_client_settings._make_result_sets_lazy
- )
-
- allow_truncated_result = _default_allow_truncated_result
- if table_client_settings:
- allow_truncated_result = table_client_settings._allow_truncated_result
-
- result_sets = []
- initializer = (
- _ResultSet.from_message if not make_lazy else _ResultSet.lazy_from_message
- )
- for result_set in result_sets_pb:
- result_set = initializer(result_set, table_client_settings)
- if result_set.truncated and not allow_truncated_result:
- raise issues.TruncatedResponseError(
- "Response for the request was truncated by server"
- )
- result_sets.append(result_set)
- super(ResultSets, self).__init__(result_sets)
diff --git a/contrib/python/ydb/py2/ydb/credentials.py b/contrib/python/ydb/py2/ydb/credentials.py
deleted file mode 100644
index 8547fbbd7b..0000000000
--- a/contrib/python/ydb/py2/ydb/credentials.py
+++ /dev/null
@@ -1,234 +0,0 @@
-# -*- coding: utf-8 -*-
-import abc
-import six
-from . import tracing, issues, connection
-from . import settings as settings_impl
-import threading
-from concurrent import futures
-import logging
-import time
-
-try:
- from ydb.public.api.protos import ydb_auth_pb2
- from ydb.public.api.grpc import ydb_auth_v1_pb2_grpc
-except ImportError:
- from contrib.ydb.public.api.protos import ydb_auth_pb2
- from contrib.ydb.public.api.grpc import ydb_auth_v1_pb2_grpc
-
-
-YDB_AUTH_TICKET_HEADER = "x-ydb-auth-ticket"
-logger = logging.getLogger(__name__)
-
-
-@six.add_metaclass(abc.ABCMeta)
-class AbstractCredentials(object):
- """
- An abstract class that provides auth metadata
- """
-
-
-@six.add_metaclass(abc.ABCMeta)
-class Credentials(object):
- def __init__(self, tracer=None):
- self.tracer = tracer if tracer is not None else tracing.Tracer(None)
-
- @abc.abstractmethod
- def auth_metadata(self):
- """
- :return: An iterable with auth metadata
- """
- pass
-
-
-class OneToManyValue(object):
- def __init__(self):
- self._value = None
- self._condition = threading.Condition()
-
- def consume(self, timeout=3):
- with self._condition:
- if self._value is None:
- self._condition.wait(timeout=timeout)
- return self._value
-
- def update(self, n_value):
- with self._condition:
- prev_value = self._value
- self._value = n_value
- if prev_value is None:
- self._condition.notify_all()
-
-
-class AtMostOneExecution(object):
- def __init__(self):
- self._can_schedule = True
- self._lock = threading.Lock()
- self._tp = futures.ThreadPoolExecutor(1)
-
- def wrapped_execution(self, callback):
- try:
- callback()
- except Exception:
- pass
-
- finally:
- self.cleanup()
-
- def submit(self, callback):
- with self._lock:
- if self._can_schedule:
- self._tp.submit(self.wrapped_execution, callback)
- self._can_schedule = False
-
- def cleanup(self):
- with self._lock:
- self._can_schedule = True
-
-
-@six.add_metaclass(abc.ABCMeta)
-class AbstractExpiringTokenCredentials(Credentials):
- def __init__(self, tracer=None):
- super(AbstractExpiringTokenCredentials, self).__init__(tracer)
- self._expires_in = 0
- self._refresh_in = 0
- self._hour = 60 * 60
- self._cached_token = OneToManyValue()
- self._tp = AtMostOneExecution()
- self.logger = logger.getChild(self.__class__.__name__)
- self.last_error = None
- self.extra_error_message = ""
-
- @abc.abstractmethod
- def _make_token_request(self):
- pass
-
- def _log_refresh_start(self, current_time):
- self.logger.debug("Start refresh token from metadata")
- if current_time > self._refresh_in:
- self.logger.info(
- "Cached token reached refresh_in deadline, current time %s, deadline %s",
- current_time,
- self._refresh_in,
- )
-
- if current_time > self._expires_in and self._expires_in > 0:
- self.logger.error(
- "Cached token reached expires_in deadline, current time %s, deadline %s",
- current_time,
- self._expires_in,
- )
-
- def _update_expiration_info(self, auth_metadata):
- self._expires_in = time.time() + min(
- self._hour, auth_metadata["expires_in"] / 2
- )
- self._refresh_in = time.time() + min(
- self._hour / 2, auth_metadata["expires_in"] / 4
- )
-
- def _refresh(self):
- current_time = time.time()
- self._log_refresh_start(current_time)
- try:
- token_response = self._make_token_request()
- self._cached_token.update(token_response["access_token"])
- self._update_expiration_info(token_response)
- self.logger.info(
- "Token refresh successful. current_time %s, refresh_in %s",
- current_time,
- self._refresh_in,
- )
-
- except (KeyboardInterrupt, SystemExit):
- return
-
- except Exception as e:
- self.last_error = str(e)
- time.sleep(1)
- self._tp.submit(self._refresh)
-
- @property
- @tracing.with_trace()
- def token(self):
- current_time = time.time()
- if current_time > self._refresh_in:
- tracing.trace(self.tracer, {"refresh": True})
- self._tp.submit(self._refresh)
- cached_token = self._cached_token.consume(timeout=3)
- tracing.trace(self.tracer, {"consumed": True})
- if cached_token is None:
- if self.last_error is None:
- raise issues.ConnectionError(
- "%s: timeout occurred while waiting for token.\n%s"
- % (
- self.__class__.__name__,
- self.extra_error_message,
- )
- )
- raise issues.ConnectionError(
- "%s: %s.\n%s"
- % (self.__class__.__name__, self.last_error, self.extra_error_message)
- )
- return cached_token
-
- def auth_metadata(self):
- return [(YDB_AUTH_TICKET_HEADER, self.token)]
-
-
-def _wrap_static_credentials_response(rpc_state, response):
- issues._process_response(response.operation)
- result = ydb_auth_pb2.LoginResult()
- response.operation.result.Unpack(result)
- return result
-
-
-class StaticCredentials(AbstractExpiringTokenCredentials):
- def __init__(self, driver_config, user, password="", tracer=None):
- super(StaticCredentials, self).__init__(tracer)
- self.driver_config = driver_config
- self.user = user
- self.password = password
- self.request_timeout = 10
-
- def _make_token_request(self):
- conn = connection.Connection.ready_factory(
- self.driver_config.endpoint, self.driver_config
- )
- assert conn is not None, (
- "Failed to establish connection in to %s" % self.driver_config.endpoint
- )
- try:
- result = conn(
- ydb_auth_pb2.LoginRequest(user=self.user, password=self.password),
- ydb_auth_v1_pb2_grpc.AuthServiceStub,
- "Login",
- _wrap_static_credentials_response,
- settings_impl.BaseRequestSettings()
- .with_timeout(self.request_timeout)
- .with_need_rpc_auth(False),
- )
- finally:
- conn.close()
- return {"expires_in": 30 * 60, "access_token": result.token}
-
-
-class AnonymousCredentials(Credentials):
- @staticmethod
- def auth_metadata():
- return []
-
-
-class AuthTokenCredentials(Credentials):
- def __init__(self, token):
- self._token = token
-
- def auth_metadata(self):
- return [(YDB_AUTH_TICKET_HEADER, self._token)]
-
-
-class AccessTokenCredentials(Credentials):
- def __init__(self, token):
- self._token = token
-
- def auth_metadata(self):
- return [(YDB_AUTH_TICKET_HEADER, self._token)]
diff --git a/contrib/python/ydb/py2/ydb/dbapi/__init__.py b/contrib/python/ydb/py2/ydb/dbapi/__init__.py
deleted file mode 100644
index 7363921192..0000000000
--- a/contrib/python/ydb/py2/ydb/dbapi/__init__.py
+++ /dev/null
@@ -1,47 +0,0 @@
-from __future__ import absolute_import
-from __future__ import unicode_literals
-
-from .connection import Connection
-from .errors import (
- Warning,
- Error,
- InterfaceError,
- DatabaseError,
- DataError,
- OperationalError,
- IntegrityError,
- InternalError,
- ProgrammingError,
- NotSupportedError,
-)
-
-version = "0.0.31"
-
-version_info = (
- 1,
- 0,
- 0,
-)
-
-apilevel = "1.0"
-
-threadsafety = 0
-
-paramstyle = "qmark"
-
-errors = (
- Warning,
- Error,
- InterfaceError,
- DatabaseError,
- DataError,
- OperationalError,
- IntegrityError,
- InternalError,
- ProgrammingError,
- NotSupportedError,
-)
-
-
-def connect(*args, **kwargs):
- return Connection(*args, **kwargs)
diff --git a/contrib/python/ydb/py2/ydb/dbapi/connection.py b/contrib/python/ydb/py2/ydb/dbapi/connection.py
deleted file mode 100644
index c69381a92f..0000000000
--- a/contrib/python/ydb/py2/ydb/dbapi/connection.py
+++ /dev/null
@@ -1,92 +0,0 @@
-from __future__ import absolute_import, unicode_literals
-
-import posixpath
-
-import ydb
-from .cursor import Cursor
-from .errors import DatabaseError
-
-
-class Connection(object):
-
- deiver = None
- pool = None
-
- def __init__(self, endpoint, database=None, **conn_kwargs):
- self.endpoint = endpoint
- self.database = database
- self._conn_kwargs = conn_kwargs
- driver, pool = self._create_driver(self.endpoint, self.database, **conn_kwargs)
- self.driver = driver
- self.pool = pool
-
- def cursor(self):
- return Cursor(self)
-
- def execute(self, sql, parameters=None):
- return self.cursor().execute(sql, parameters)
-
- def executemany(self, sql, parameters):
- return self.cursor().executemany(sql, parameters)
-
- def describe(self, table_path):
- full_path = posixpath.join(self.database, table_path)
- try:
- res = self.pool.retry_operation_sync(
- lambda cli: cli.describe_table(full_path)
- )
- return res.columns
- except ydb.Error as e:
- raise DatabaseError(e.message, e.issues, e.status)
-
- except Exception:
- raise DatabaseError("Failed to describe table %r" % (table_path,))
-
- def check_exists(self, table_path):
- try:
- self.driver.scheme_client.describe_path(table_path)
- return True
- except ydb.SchemeError:
- return False
-
- def commit(self):
- pass
-
- def rollback(self):
- pass
-
- def close(self):
- if self.pool is not None:
- self.pool.stop()
- if self.driver is not None:
- self.driver.stop()
-
- @staticmethod
- def _create_endpoint(host, port):
- return "%s:%d" % (host, port)
-
- @staticmethod
- def _create_driver(endpoint, database, **conn_kwargs):
- driver_config = ydb.DriverConfig(
- endpoint,
- database=database,
- table_client_settings=ydb.TableClientSettings()
- .with_native_date_in_result_sets(True)
- .with_native_datetime_in_result_sets(True)
- .with_native_json_in_result_sets(True),
- **conn_kwargs
- )
- driver = ydb.Driver(driver_config)
- try:
- driver.wait(timeout=5, fail_fast=True)
- except ydb.Error as e:
- raise DatabaseError(e.message, e.issues, e.status)
-
- except Exception:
- driver.stop()
- raise DatabaseError(
- "Failed to connect to YDB, details %s"
- % driver.discovery_debug_details()
- )
-
- return driver, ydb.SessionPool(driver)
diff --git a/contrib/python/ydb/py2/ydb/dbapi/cursor.py b/contrib/python/ydb/py2/ydb/dbapi/cursor.py
deleted file mode 100644
index 71175abf4e..0000000000
--- a/contrib/python/ydb/py2/ydb/dbapi/cursor.py
+++ /dev/null
@@ -1,184 +0,0 @@
-from __future__ import absolute_import, unicode_literals
-
-import collections
-import datetime
-import itertools
-import logging
-
-import six
-
-import ydb
-from .errors import DatabaseError
-
-
-LOGGER = logging.getLogger(__name__)
-
-
-STR_QUOTE_MAP = (
- ("\\", "\\\\"),
- ("'", r"\'"),
- ("\0", r"\x00"),
- # To re-check: \b \f \r \n \t
-)
-
-
-def render_str(value):
- for r_from, r_to in STR_QUOTE_MAP:
- value = value.replace(r_from, r_to)
- return "'" + value + "'"
-
-
-def render_date(value):
- return "Date({})".format(render_str(value.isoformat()))
-
-
-def render_datetime(value):
- # TODO: is there a better solution for this?
- return "DateTime::MakeDatetime(DateTime::ParseIso8601({}))".format(
- render_str(value.isoformat())
- )
-
-
-def render(value):
- if value is None:
- return "NULL"
- if isinstance(value, six.string_types):
- return render_str(value)
- if isinstance(value, datetime.datetime):
- return render_datetime(value)
- if isinstance(value, datetime.date):
- return render_date(value)
- return repr(value)
-
-
-def render_sql(sql, parameters):
- if not parameters:
- return sql
-
- assert sql.count("?") == len(parameters), "num of placeholders != num of params"
-
- quoted_params = [render(param) for param in parameters]
- quoted_params += [""]
- sql_pieces = sql.split("?")
- assert len(sql_pieces) == len(quoted_params)
- return "".join(
- piece for pair in zip(sql_pieces, quoted_params) for piece in pair if piece
- )
-
-
-def named_result_for(column_names):
- # TODO fix: this doesn't allow columns names starting with underscore, e.g. `select 1 as _a`.
- return collections.namedtuple("NamedResult", column_names)
-
-
-def _get_column_type(type_obj):
- return str(type_obj)
-
-
-def get_column_type(type_obj):
- return _get_column_type(ydb.convert.type_to_native(type_obj))
-
-
-class Cursor(object):
- def __init__(self, connection):
- self.connection = connection
- self.description = []
- self.arraysize = 1
- self.logger = LOGGER
- self.rows = None
- self._rows_prefetched = None
-
- def execute(self, sql, parameters=None):
- fsql = render_sql(sql, parameters)
- self.logger.debug("execute sql: %s", fsql)
- try:
- chunks = self.connection.driver.table_client.scan_query(fsql)
- except ydb.Error as e:
- raise DatabaseError(e.message, e.issues, e.status)
-
- self.description = []
-
- rows = self._rows_iterable(chunks)
- # Prefetch the description:
- try:
- first_row = next(rows)
- except StopIteration:
- pass
- else:
- rows = itertools.chain((first_row,), rows)
- if self.rows is not None:
- rows = itertools.chain(self.rows, rows)
-
- self.rows = rows
-
- def _rows_iterable(self, chunks_iterable):
- description = None
- try:
- for chunk in chunks_iterable:
- if description is None and len(chunk.result_set.rows) > 0:
- description = [
- (
- col.name,
- get_column_type(col.type),
- None,
- None,
- None,
- None,
- None,
- )
- for col in chunk.result_set.columns
- ]
- self.description = description
- for row in chunk.result_set.rows:
- # returns tuple to be compatible with SqlAlchemy and because
- # of this PEP to return a sequence: https://www.python.org/dev/peps/pep-0249/#fetchmany
- yield row[::]
- except ydb.Error as e:
- raise DatabaseError(e.message, e.issues, e.status)
-
- def _ensure_prefetched(self):
- if self.rows is not None and self._rows_prefetched is None:
- self._rows_prefetched = list(self.rows)
- self.rows = iter(self._rows_prefetched)
- return self._rows_prefetched
-
- def executemany(self, sql, seq_of_parameters):
- for parameters in seq_of_parameters:
- self.execute(sql, parameters)
-
- def executescript(self, script):
- return self.execute(script)
-
- def fetchone(self):
- if self.rows is None:
- return None
- try:
- return next(self.rows)
- except StopIteration:
- return None
-
- def fetchmany(self, size=None):
- if size is None:
- size = self.arraysize
-
- return list(itertools.islice(self.rows, size))
-
- def fetchall(self):
- return list(self.rows)
-
- def nextset(self):
- self.fetchall()
-
- def setinputsizes(self, sizes):
- pass
-
- def setoutputsize(self, column=None):
- pass
-
- def close(self):
- self.rows = None
- self._rows_prefetched = None
-
- @property
- def rowcount(self):
- return len(self._ensure_prefetched())
diff --git a/contrib/python/ydb/py2/ydb/dbapi/errors.py b/contrib/python/ydb/py2/ydb/dbapi/errors.py
deleted file mode 100644
index f4309f3812..0000000000
--- a/contrib/python/ydb/py2/ydb/dbapi/errors.py
+++ /dev/null
@@ -1,103 +0,0 @@
-class Warning(Exception):
- pass
-
-
-class Error(Exception):
- def __init__(self, message, issues=None, status=None):
-
- pretty_issues = _pretty_issues(issues)
- message = message if pretty_issues is None else pretty_issues
-
- super(Error, self).__init__(message)
- self.issues = issues
- self.message = message
- self.status = status
-
-
-class InterfaceError(Error):
- pass
-
-
-class DatabaseError(Error):
- pass
-
-
-class DataError(DatabaseError):
- pass
-
-
-class OperationalError(DatabaseError):
- pass
-
-
-class IntegrityError(DatabaseError):
- pass
-
-
-class InternalError(DatabaseError):
- pass
-
-
-class ProgrammingError(DatabaseError):
- pass
-
-
-class NotSupportedError(DatabaseError):
- pass
-
-
-def _pretty_issues(issues):
- if issues is None:
- return None
-
- children_messages = [_get_messages(issue, root=True) for issue in issues]
-
- if None in children_messages:
- return None
-
- return "\n" + "\n".join(children_messages)
-
-
-def _get_messages(issue, max_depth=100, indent=2, depth=0, root=False):
- if depth >= max_depth:
- return None
- margin_str = " " * depth * indent
- pre_message = ""
- children = ""
- if issue.issues:
- collapsed_messages = []
- while not root and len(issue.issues) == 1:
- collapsed_messages.append(issue.message)
- issue = issue.issues[0]
- if collapsed_messages:
- pre_message = margin_str + ", ".join(collapsed_messages) + "\n"
- depth += 1
- margin_str = " " * depth * indent
- else:
- pre_message = ""
-
- children_messages = [
- _get_messages(iss, max_depth=max_depth, indent=indent, depth=depth + 1)
- for iss in issue.issues
- ]
-
- if None in children_messages:
- return None
-
- children = "\n".join(children_messages)
-
- return (
- pre_message
- + margin_str
- + issue.message
- + "\n"
- + margin_str
- + "severity level: "
- + str(issue.severity)
- + "\n"
- + margin_str
- + "issue code: "
- + str(issue.issue_code)
- + "\n"
- + children
- )
diff --git a/contrib/python/ydb/py2/ydb/default_pem.py b/contrib/python/ydb/py2/ydb/default_pem.py
deleted file mode 100644
index 92286ba237..0000000000
--- a/contrib/python/ydb/py2/ydb/default_pem.py
+++ /dev/null
@@ -1,4691 +0,0 @@
-import six
-
-
-data = """
-# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA
-# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA
-# Label: "GlobalSign Root CA"
-# Serial: 4835703278459707669005204
-# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a
-# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c
-# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99
------BEGIN CERTIFICATE-----
-MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG
-A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
-b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw
-MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
-YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT
-aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ
-jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp
-xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp
-1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG
-snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ
-U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8
-9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E
-BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B
-AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz
-yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE
-38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP
-AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad
-DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME
-HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
------END CERTIFICATE-----
-
-# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2
-# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2
-# Label: "GlobalSign Root CA - R2"
-# Serial: 4835703278459682885658125
-# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30
-# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe
-# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e
------BEGIN CERTIFICATE-----
-MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G
-A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp
-Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1
-MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG
-A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL
-v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8
-eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq
-tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd
-C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa
-zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB
-mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH
-V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n
-bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG
-3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs
-J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO
-291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS
-ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd
-AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
-TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
------END CERTIFICATE-----
-
-# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only
-# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only
-# Label: "Verisign Class 3 Public Primary Certification Authority - G3"
-# Serial: 206684696279472310254277870180966723415
-# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09
-# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6
-# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44
------BEGIN CERTIFICATE-----
-MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw
-CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
-cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
-LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
-aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
-dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
-VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
-aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
-bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
-IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
-LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b
-N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t
-KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu
-kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm
-CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ
-Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu
-imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te
-2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe
-DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
-/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p
-F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt
-TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
------END CERTIFICATE-----
-
-# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited
-# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited
-# Label: "Entrust.net Premium 2048 Secure Server CA"
-# Serial: 946069240
-# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90
-# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31
-# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77
------BEGIN CERTIFICATE-----
-MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML
-RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp
-bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5
-IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp
-ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3
-MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3
-LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp
-YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG
-A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq
-K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe
-sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX
-MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT
-XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/
-HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH
-4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV
-HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub
-j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo
-U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf
-zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b
-u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+
-bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er
-fF6adulZkMV8gzURZVE=
------END CERTIFICATE-----
-
-# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust
-# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust
-# Label: "Baltimore CyberTrust Root"
-# Serial: 33554617
-# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4
-# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74
-# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb
------BEGIN CERTIFICATE-----
-MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ
-RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD
-VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX
-DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y
-ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy
-VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr
-mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr
-IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK
-mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu
-XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy
-dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye
-jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1
-BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3
-DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92
-9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx
-jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0
-Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz
-ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS
-R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
------END CERTIFICATE-----
-
-# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network
-# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network
-# Label: "AddTrust External Root"
-# Serial: 1
-# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f
-# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68
-# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2
------BEGIN CERTIFICATE-----
-MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU
-MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs
-IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290
-MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux
-FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h
-bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v
-dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt
-H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9
-uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX
-mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX
-a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN
-E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0
-WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD
-VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0
-Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU
-cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx
-IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN
-AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH
-YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
-6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC
-Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX
-c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a
-mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
------END CERTIFICATE-----
-
-# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc.
-# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc.
-# Label: "Entrust Root Certification Authority"
-# Serial: 1164660820
-# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4
-# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9
-# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c
------BEGIN CERTIFICATE-----
-MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC
-VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0
-Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW
-KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl
-cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw
-NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw
-NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy
-ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV
-BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ
-KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo
-Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4
-4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9
-KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI
-rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi
-94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB
-sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi
-gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo
-kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE
-vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
-A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t
-O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua
-AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP
-9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/
-eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m
-0vdXcDazv/wor3ElhVsT/h5/WrQ8
------END CERTIFICATE-----
-
-# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc.
-# Subject: CN=GeoTrust Global CA O=GeoTrust Inc.
-# Label: "GeoTrust Global CA"
-# Serial: 144470
-# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5
-# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12
-# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a
------BEGIN CERTIFICATE-----
-MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
-MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
-YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG
-EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg
-R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9
-9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq
-fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv
-iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU
-1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+
-bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW
-MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA
-ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l
-uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn
-Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS
-tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF
-PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un
-hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV
-5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==
------END CERTIFICATE-----
-
-# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc.
-# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc.
-# Label: "GeoTrust Universal CA"
-# Serial: 1
-# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48
-# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79
-# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12
------BEGIN CERTIFICATE-----
-MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW
-MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy
-c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE
-BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0
-IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV
-VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8
-cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT
-QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh
-F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v
-c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w
-mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd
-VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX
-teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ
-f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe
-Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+
-nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB
-/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY
-MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG
-9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
-aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX
-IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn
-ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z
-uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN
-Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja
-QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW
-koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9
-ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt
-DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm
-bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw=
------END CERTIFICATE-----
-
-# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc.
-# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc.
-# Label: "GeoTrust Universal CA 2"
-# Serial: 1
-# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7
-# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79
-# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b
------BEGIN CERTIFICATE-----
-MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW
-MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy
-c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD
-VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1
-c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
-AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81
-WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG
-FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq
-XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL
-se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb
-KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd
-IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73
-y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt
-hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc
-QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4
-Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV
-HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV
-HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ
-KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
-dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ
-L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr
-Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo
-ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY
-T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz
-GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m
-1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV
-OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH
-6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX
-QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
------END CERTIFICATE-----
-
-# Issuer: CN=AAA Certificate Services O=Comodo CA Limited
-# Subject: CN=AAA Certificate Services O=Comodo CA Limited
-# Label: "Comodo AAA Services root"
-# Serial: 1
-# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0
-# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49
-# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4
------BEGIN CERTIFICATE-----
-MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb
-MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
-GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj
-YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL
-MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
-BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM
-GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
-ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua
-BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe
-3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4
-YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR
-rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm
-ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU
-oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
-MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v
-QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t
-b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF
-AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q
-GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
-Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2
-G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi
-l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3
-smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
------END CERTIFICATE-----
-
-# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority
-# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority
-# Label: "QuoVadis Root CA"
-# Serial: 985026699
-# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24
-# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9
-# SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73
------BEGIN CERTIFICATE-----
-MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC
-TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0
-aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0
-aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz
-MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw
-IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR
-dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG
-9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp
-li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D
-rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ
-WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug
-F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU
-xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC
-Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv
-dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw
-ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl
-IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh
-c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy
-ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
-Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI
-KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T
-KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq
-y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p
-dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD
-VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL
-MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk
-fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8
-7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R
-cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y
-mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW
-xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK
-SnQ2+Q==
------END CERTIFICATE-----
-
-# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited
-# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited
-# Label: "QuoVadis Root CA 2"
-# Serial: 1289
-# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b
-# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7
-# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86
------BEGIN CERTIFICATE-----
-MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x
-GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv
-b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV
-BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W
-YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa
-GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg
-Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J
-WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB
-rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp
-+ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1
-ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i
-Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz
-PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og
-/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH
-oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI
-yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud
-EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2
-A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL
-MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT
-ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f
-BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn
-g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl
-fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K
-WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha
-B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc
-hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR
-TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD
-mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z
-ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y
-4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza
-8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u
------END CERTIFICATE-----
-
-# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited
-# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited
-# Label: "QuoVadis Root CA 3"
-# Serial: 1478
-# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf
-# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85
-# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35
------BEGIN CERTIFICATE-----
-MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x
-GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv
-b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV
-BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W
-YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM
-V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB
-4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr
-H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd
-8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv
-vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT
-mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe
-btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc
-T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt
-WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ
-c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A
-4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD
-VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG
-CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0
-aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
-aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu
-dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw
-czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G
-A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC
-TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg
-Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0
-7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem
-d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd
-+LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B
-4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN
-t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x
-DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57
-k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s
-zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j
-Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT
-mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK
-4SVhM7JZG+Ju1zdXtg2pEto=
------END CERTIFICATE-----
-
-# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1
-# Subject: O=SECOM Trust.net OU=Security Communication RootCA1
-# Label: "Security Communication Root CA"
-# Serial: 0
-# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a
-# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7
-# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c
------BEGIN CERTIFICATE-----
-MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY
-MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t
-dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5
-WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD
-VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3
-DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8
-9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ
-DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9
-Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N
-QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ
-xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G
-A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T
-AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG
-kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr
-Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5
-Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU
-JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot
-RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw==
------END CERTIFICATE-----
-
-# Issuer: CN=Sonera Class2 CA O=Sonera
-# Subject: CN=Sonera Class2 CA O=Sonera
-# Label: "Sonera Class 2 Root CA"
-# Serial: 29
-# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb
-# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27
-# SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27
------BEGIN CERTIFICATE-----
-MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP
-MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx
-MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV
-BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o
-Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt
-5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s
-3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej
-vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu
-8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw
-DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG
-MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil
-zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/
-3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD
-FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6
-Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2
-ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M
------END CERTIFICATE-----
-
-# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com
-# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com
-# Label: "XRamp Global CA Root"
-# Serial: 107108908803651509692980124233745014957
-# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1
-# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6
-# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2
------BEGIN CERTIFICATE-----
-MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB
-gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk
-MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY
-UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx
-NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3
-dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy
-dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
-dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6
-38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP
-KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q
-DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4
-qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa
-JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi
-PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P
-BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs
-jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0
-eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD
-ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR
-vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
-qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa
-IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy
-i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ
-O+7ETPTsJ3xCwnR8gooJybQDJbw=
------END CERTIFICATE-----
-
-# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority
-# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority
-# Label: "Go Daddy Class 2 CA"
-# Serial: 0
-# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67
-# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4
-# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4
------BEGIN CERTIFICATE-----
-MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh
-MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE
-YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3
-MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo
-ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg
-MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN
-ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA
-PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w
-wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi
-EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY
-avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+
-YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE
-sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h
-/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5
-IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj
-YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD
-ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy
-OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P
-TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
-HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER
-dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf
-ReYNnyicsbkqWletNw+vHX/bvZ8=
------END CERTIFICATE-----
-
-# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority
-# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority
-# Label: "Starfield Class 2 CA"
-# Serial: 0
-# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24
-# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a
-# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58
------BEGIN CERTIFICATE-----
-MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl
-MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp
-U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw
-NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE
-ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp
-ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3
-DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf
-8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN
-+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0
-X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa
-K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA
-1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G
-A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR
-zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0
-YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD
-bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w
-DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3
-L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D
-eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
-xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp
-VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY
-WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q=
------END CERTIFICATE-----
-
-# Issuer: O=Government Root Certification Authority
-# Subject: O=Government Root Certification Authority
-# Label: "Taiwan GRCA"
-# Serial: 42023070807708724159991140556527066870
-# MD5 Fingerprint: 37:85:44:53:32:45:1f:20:f0:f3:95:e1:25:c4:43:4e
-# SHA1 Fingerprint: f4:8b:11:bf:de:ab:be:94:54:20:71:e6:41:de:6b:be:88:2b:40:b9
-# SHA256 Fingerprint: 76:00:29:5e:ef:e8:5b:9e:1f:d6:24:db:76:06:2a:aa:ae:59:81:8a:54:d2:77:4c:d4:c0:b2:c0:11:31:e1:b3
------BEGIN CERTIFICATE-----
-MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/
-MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj
-YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow
-PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp
-Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
-AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR
-IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q
-gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy
-yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts
-F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2
-jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx
-ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC
-VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK
-YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH
-EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN
-Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud
-DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE
-MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK
-UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ
-TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf
-qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK
-ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE
-JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7
-hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1
-EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm
-nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX
-udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz
-ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe
-LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl
-pYYsfPQS
------END CERTIFICATE-----
-
-# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com
-# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com
-# Label: "DigiCert Assured ID Root CA"
-# Serial: 17154717934120587862167794914071425081
-# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72
-# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43
-# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c
------BEGIN CERTIFICATE-----
-MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl
-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
-d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
-b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG
-EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
-cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi
-MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c
-JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP
-mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+
-wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4
-VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/
-AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB
-AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW
-BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun
-pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC
-dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf
-fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm
-NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx
-H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
-+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
------END CERTIFICATE-----
-
-# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com
-# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com
-# Label: "DigiCert Global Root CA"
-# Serial: 10944719598952040374951832963794454346
-# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e
-# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36
-# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61
------BEGIN CERTIFICATE-----
-MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh
-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
-d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
-QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT
-MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
-b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG
-9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB
-CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97
-nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt
-43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P
-T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4
-gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO
-BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR
-TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw
-DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr
-hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg
-06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF
-PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls
-YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
-CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
------END CERTIFICATE-----
-
-# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com
-# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com
-# Label: "DigiCert High Assurance EV Root CA"
-# Serial: 3553400076410547919724730734378100087
-# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a
-# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25
-# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf
------BEGIN CERTIFICATE-----
-MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs
-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
-d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
-ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL
-MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
-LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug
-RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm
-+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW
-PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM
-xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB
-Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3
-hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg
-EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF
-MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA
-FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec
-nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z
-eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF
-hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2
-Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
-vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep
-+OkuE6N36B9K
------END CERTIFICATE-----
-
-# Issuer: CN=Class 2 Primary CA O=Certplus
-# Subject: CN=Class 2 Primary CA O=Certplus
-# Label: "Certplus Class 2 Primary CA"
-# Serial: 177770208045934040241468760488327595043
-# MD5 Fingerprint: 88:2c:8c:52:b8:a2:3c:f3:f7:bb:03:ea:ae:ac:42:0b
-# SHA1 Fingerprint: 74:20:74:41:72:9c:dd:92:ec:79:31:d8:23:10:8d:c2:81:92:e2:bb
-# SHA256 Fingerprint: 0f:99:3c:8a:ef:97:ba:af:56:87:14:0e:d5:9a:d1:82:1b:b4:af:ac:f0:aa:9a:58:b5:d5:7a:33:8a:3a:fb:cb
------BEGIN CERTIFICATE-----
-MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw
-PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz
-cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9
-MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz
-IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ
-ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR
-VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL
-kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd
-EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas
-H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0
-HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud
-DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4
-QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu
-Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/
-AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8
-yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR
-FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA
-ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB
-kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7
-l7+ijrRU
------END CERTIFICATE-----
-
-# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co.
-# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co.
-# Label: "DST Root CA X3"
-# Serial: 91299735575339953335919266965803778155
-# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5
-# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13
-# SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39
------BEGIN CERTIFICATE-----
-MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/
-MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
-DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow
-PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD
-Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
-AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O
-rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq
-OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b
-xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw
-7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD
-aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV
-HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG
-SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69
-ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr
-AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz
-R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5
-JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo
-Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
------END CERTIFICATE-----
-
-# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG
-# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG
-# Label: "SwissSign Gold CA - G2"
-# Serial: 13492815561806991280
-# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93
-# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61
-# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95
------BEGIN CERTIFICATE-----
-MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV
-BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln
-biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF
-MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT
-d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
-CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8
-76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+
-bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c
-6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE
-emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd
-MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt
-MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y
-MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y
-FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi
-aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM
-gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB
-qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7
-lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn
-8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov
-L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6
-45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO
-UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5
-O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC
-bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv
-GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a
-77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC
-hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3
-92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp
-Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w
-ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt
-Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ
------END CERTIFICATE-----
-
-# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG
-# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG
-# Label: "SwissSign Silver CA - G2"
-# Serial: 5700383053117599563
-# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13
-# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb
-# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5
------BEGIN CERTIFICATE-----
-MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE
-BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu
-IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow
-RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY
-U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
-MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv
-Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br
-YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF
-nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH
-6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt
-eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/
-c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ
-MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH
-HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf
-jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6
-5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB
-rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU
-F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c
-wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0
-cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB
-AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp
-WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9
-xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ
-2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ
-IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8
-aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X
-em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR
-dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/
-OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+
-hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy
-tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u
------END CERTIFICATE-----
-
-# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc.
-# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc.
-# Label: "GeoTrust Primary Certification Authority"
-# Serial: 32798226551256963324313806436981982369
-# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf
-# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96
-# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c
------BEGIN CERTIFICATE-----
-MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY
-MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo
-R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx
-MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
-Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp
-ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
-AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9
-AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA
-ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0
-7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W
-kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI
-mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G
-A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ
-KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1
-6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl
-4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K
-oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj
-UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU
-AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
------END CERTIFICATE-----
-
-# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only
-# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only
-# Label: "thawte Primary Root CA"
-# Serial: 69529181992039203566298953787712940909
-# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12
-# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81
-# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f
------BEGIN CERTIFICATE-----
-MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB
-qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
-Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
-MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV
-BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw
-NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j
-LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG
-A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
-IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG
-SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs
-W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta
-3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk
-6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6
-Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J
-NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA
-MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP
-r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU
-DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz
-YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
-xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2
-/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/
-LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7
-jVaMaA==
------END CERTIFICATE-----
-
-# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only
-# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only
-# Label: "VeriSign Class 3 Public Primary Certification Authority - G5"
-# Serial: 33037644167568058970164719475676101450
-# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c
-# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5
-# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df
------BEGIN CERTIFICATE-----
-MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB
-yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
-ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp
-U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW
-ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0
-aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL
-MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
-ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln
-biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
-U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
-aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1
-nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex
-t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz
-SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG
-BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+
-rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/
-NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E
-BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH
-BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
-aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv
-MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE
-p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y
-5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK
-WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ
-4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N
-hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
------END CERTIFICATE-----
-
-# Issuer: CN=SecureTrust CA O=SecureTrust Corporation
-# Subject: CN=SecureTrust CA O=SecureTrust Corporation
-# Label: "SecureTrust CA"
-# Serial: 17199774589125277788362757014266862032
-# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1
-# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11
-# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73
------BEGIN CERTIFICATE-----
-MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI
-MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x
-FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz
-MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv
-cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN
-AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz
-Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO
-0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao
-wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj
-7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS
-8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT
-BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB
-/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg
-JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC
-NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3
-6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/
-3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm
-D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS
-CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
-3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
------END CERTIFICATE-----
-
-# Issuer: CN=Secure Global CA O=SecureTrust Corporation
-# Subject: CN=Secure Global CA O=SecureTrust Corporation
-# Label: "Secure Global CA"
-# Serial: 9751836167731051554232119481456978597
-# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de
-# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b
-# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69
------BEGIN CERTIFICATE-----
-MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK
-MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x
-GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx
-MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg
-Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG
-SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ
-iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa
-/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ
-jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI
-HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7
-sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w
-gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF
-MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw
-KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG
-AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L
-URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO
-H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm
-I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY
-iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
-f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
------END CERTIFICATE-----
-
-# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited
-# Subject: CN=COMODO Certification Authority O=COMODO CA Limited
-# Label: "COMODO Certification Authority"
-# Serial: 104350513648249232941998508985834464573
-# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75
-# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b
-# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66
------BEGIN CERTIFICATE-----
-MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB
-gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
-A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV
-BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw
-MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl
-YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P
-RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0
-aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3
-UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI
-2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8
-Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp
-+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+
-DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O
-nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW
-/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g
-PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u
-QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY
-SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv
-IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
-RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4
-zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd
-BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB
-ZQ==
------END CERTIFICATE-----
-
-# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C.
-# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C.
-# Label: "Network Solutions Certificate Authority"
-# Serial: 116697915152937497490437556386812487904
-# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e
-# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce
-# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c
------BEGIN CERTIFICATE-----
-MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi
-MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
-MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp
-dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV
-UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO
-ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG
-SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz
-c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP
-OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl
-mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF
-BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4
-qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw
-gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB
-BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu
-bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp
-dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8
-6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/
-h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH
-/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
-wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN
-pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
------END CERTIFICATE-----
-
-# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited
-# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited
-# Label: "COMODO ECC Certification Authority"
-# Serial: 41578283867086692638256921589707938090
-# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23
-# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11
-# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7
------BEGIN CERTIFICATE-----
-MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL
-MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
-BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT
-IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw
-MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy
-ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N
-T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv
-biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR
-FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J
-cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW
-BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
-BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm
-fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv
-GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
------END CERTIFICATE-----
-
-# Issuer: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed
-# Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed
-# Label: "OISTE WISeKey Global Root GA CA"
-# Serial: 86718877871133159090080555911823548314
-# MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93
-# SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9
-# SHA256 Fingerprint: 41:c9:23:86:6a:b4:ca:d6:b7:ad:57:80:81:58:2e:02:07:97:a6:cb:df:4f:ff:78:ce:83:96:b3:89:37:d7:f5
------BEGIN CERTIFICATE-----
-MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB
-ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly
-aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl
-ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w
-NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G
-A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD
-VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX
-SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
-MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR
-VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2
-w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF
-mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg
-4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9
-4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw
-DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw
-EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx
-SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2
-ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8
-vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
-hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi
-Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ
-/L7fCg0=
------END CERTIFICATE-----
-
-# Issuer: CN=Certigna O=Dhimyotis
-# Subject: CN=Certigna O=Dhimyotis
-# Label: "Certigna"
-# Serial: 18364802974209362175
-# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff
-# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97
-# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d
------BEGIN CERTIFICATE-----
-MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV
-BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X
-DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ
-BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3
-DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4
-QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny
-gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw
-zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q
-130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2
-JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw
-DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw
-ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT
-AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj
-AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG
-9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h
-bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc
-fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu
-HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w
-t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
-WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
------END CERTIFICATE-----
-
-# Issuer: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center
-# Subject: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center
-# Label: "Deutsche Telekom Root CA 2"
-# Serial: 38
-# MD5 Fingerprint: 74:01:4a:91:b1:08:c4:58:ce:47:cd:f0:dd:11:53:08
-# SHA1 Fingerprint: 85:a4:08:c0:9c:19:3e:5d:51:58:7d:cd:d6:13:30:fd:8c:de:37:bf
-# SHA256 Fingerprint: b6:19:1a:50:d0:c3:97:7f:7d:a9:9b:cd:aa:c8:6a:22:7d:ae:b9:67:9e:c7:0b:a3:b0:c9:d9:22:71:c1:70:d3
------BEGIN CERTIFICATE-----
-MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc
-MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj
-IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB
-IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE
-RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl
-U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290
-IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU
-ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC
-QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr
-rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S
-NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc
-QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH
-txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP
-BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC
-AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp
-tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa
-IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl
-6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+
-xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
-Cm26OWMohpLzGITY+9HPBVZkVw==
------END CERTIFICATE-----
-
-# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc
-# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc
-# Label: "Cybertrust Global Root"
-# Serial: 4835703278459682877484360
-# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1
-# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6
-# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3
------BEGIN CERTIFICATE-----
-MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG
-A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh
-bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE
-ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS
-b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5
-7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS
-J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y
-HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP
-t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz
-FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY
-XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/
-MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw
-hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js
-MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA
-A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj
-Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx
-XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o
-omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc
-A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
-WL1WMRJOEcgh4LMRkWXbtKaIOM5V
------END CERTIFICATE-----
-
-# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority
-# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority
-# Label: "ePKI Root Certification Authority"
-# Serial: 28956088682735189655030529057352760477
-# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3
-# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0
-# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5
------BEGIN CERTIFICATE-----
-MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe
-MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0
-ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe
-Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw
-IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL
-SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF
-AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH
-SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh
-ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X
-DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1
-TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ
-fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA
-sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU
-WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS
-nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH
-dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip
-NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC
-AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF
-MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH
-ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB
-uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl
-PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP
-JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/
-gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2
-j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6
-5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB
-o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS
-/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z
-Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE
-W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D
-hNQ+IIX3Sj0rnP0qCglN6oH4EZw=
------END CERTIFICATE-----
-
-# Issuer: O=certSIGN OU=certSIGN ROOT CA
-# Subject: O=certSIGN OU=certSIGN ROOT CA
-# Label: "certSIGN ROOT CA"
-# Serial: 35210227249154
-# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17
-# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b
-# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb
------BEGIN CERTIFICATE-----
-MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT
-AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD
-QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP
-MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC
-ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do
-0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ
-UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d
-RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ
-OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv
-JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C
-AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O
-BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ
-LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY
-MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ
-44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I
-Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw
-i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN
-9u6wWk5JRFRYX0KD
------END CERTIFICATE-----
-
-# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only
-# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only
-# Label: "GeoTrust Primary Certification Authority - G3"
-# Serial: 28809105769928564313984085209975885599
-# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05
-# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd
-# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4
------BEGIN CERTIFICATE-----
-MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB
-mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT
-MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s
-eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv
-cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ
-BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
-MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0
-BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
-LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz
-+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm
-hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn
-5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W
-JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL
-DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC
-huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw
-HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB
-AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB
-zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN
-kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
-AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH
-SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G
-spki4cErx5z481+oghLrGREt
------END CERTIFICATE-----
-
-# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only
-# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only
-# Label: "thawte Primary Root CA - G2"
-# Serial: 71758320672825410020661621085256472406
-# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f
-# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12
-# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57
------BEGIN CERTIFICATE-----
-MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL
-MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp
-IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi
-BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw
-MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
-d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig
-YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v
-dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/
-BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6
-papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E
-BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K
-DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3
-KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox
-XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
------END CERTIFICATE-----
-
-# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only
-# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only
-# Label: "thawte Primary Root CA - G3"
-# Serial: 127614157056681299805556476275995414779
-# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31
-# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2
-# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c
------BEGIN CERTIFICATE-----
-MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB
-rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
-Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
-MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV
-BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa
-Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl
-LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u
-MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl
-ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm
-gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8
-YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf
-b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9
-9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S
-zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk
-OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV
-HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA
-2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW
-oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
-t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c
-KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM
-m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu
-MdRAGmI0Nj81Aa6sY6A=
------END CERTIFICATE-----
-
-# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only
-# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only
-# Label: "GeoTrust Primary Certification Authority - G2"
-# Serial: 80682863203381065782177908751794619243
-# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a
-# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0
-# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66
------BEGIN CERTIFICATE-----
-MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL
-MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj
-KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2
-MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
-eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV
-BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw
-NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV
-BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH
-MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL
-So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal
-tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO
-BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG
-CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT
-qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz
-rD6ogRLQy7rQkgu2npaqBA+K
------END CERTIFICATE-----
-
-# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only
-# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only
-# Label: "VeriSign Universal Root Certification Authority"
-# Serial: 85209574734084581917763752644031726877
-# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19
-# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54
-# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c
------BEGIN CERTIFICATE-----
-MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB
-vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
-ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp
-U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W
-ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe
-Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX
-MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0
-IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y
-IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh
-bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF
-9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH
-H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H
-LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN
-/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT
-rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud
-EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw
-WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs
-exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
-DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4
-sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+
-seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz
-4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+
-BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR
-lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3
-7M2CYfE45k+XmCpajQ==
------END CERTIFICATE-----
-
-# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only
-# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only
-# Label: "VeriSign Class 3 Public Primary Certification Authority - G4"
-# Serial: 63143484348153506665311985501458640051
-# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41
-# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a
-# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79
------BEGIN CERTIFICATE-----
-MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL
-MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
-ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln
-biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
-U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
-aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG
-A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp
-U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg
-SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln
-biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
-IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm
-GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve
-fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw
-AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ
-aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj
-aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW
-kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC
-4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga
-FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
------END CERTIFICATE-----
-
-# Issuer: CN=NetLock Arany (Class Gold) Főtanúsítvány O=NetLock Kft. OU=Tanúsítványkiadók (Certification Services)
-# Subject: CN=NetLock Arany (Class Gold) Főtanúsítvány O=NetLock Kft. OU=Tanúsítványkiadók (Certification Services)
-# Label: "NetLock Arany (Class Gold) Főtanúsítvány"
-# Serial: 80544274841616
-# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88
-# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91
-# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98
------BEGIN CERTIFICATE-----
-MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG
-EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3
-MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl
-cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR
-dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB
-pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM
-b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm
-aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz
-IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
-MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT
-lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz
-AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5
-VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG
-ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2
-BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG
-AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M
-U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh
-bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C
-+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
-bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F
-uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2
-XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
------END CERTIFICATE-----
-
-# Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden
-# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden
-# Label: "Staat der Nederlanden Root CA - G2"
-# Serial: 10000012
-# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a
-# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16
-# SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f
------BEGIN CERTIFICATE-----
-MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO
-TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh
-dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX
-DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl
-ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv
-b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291
-qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp
-uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU
-Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE
-pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp
-5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M
-UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN
-GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy
-5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv
-6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK
-eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6
-B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/
-BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov
-L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV
-HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG
-SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS
-CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen
-5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897
-IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK
-gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL
-+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL
-vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm
-bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk
-N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC
-Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z
-ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ==
------END CERTIFICATE-----
-
-# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post
-# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post
-# Label: "Hongkong Post Root CA 1"
-# Serial: 1000
-# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca
-# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58
-# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2
------BEGIN CERTIFICATE-----
-MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx
-FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg
-Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG
-A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr
-b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
-AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ
-jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn
-PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh
-ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9
-nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h
-q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED
-MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC
-mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3
-7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB
-oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs
-EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO
-fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi
-AmvZWg==
------END CERTIFICATE-----
-
-# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc.
-# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc.
-# Label: "SecureSign RootCA11"
-# Serial: 1
-# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26
-# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3
-# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12
------BEGIN CERTIFICATE-----
-MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr
-MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG
-A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0
-MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp
-Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD
-QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz
-i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8
-h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV
-MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9
-UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni
-8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC
-h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD
-VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB
-AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm
-KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ
-X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr
-QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5
-pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN
-QSdJQO7e5iNEOdyhIta6A/I=
------END CERTIFICATE-----
-
-# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd.
-# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd.
-# Label: "Microsec e-Szigno Root CA 2009"
-# Serial: 14014712776195784473
-# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1
-# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e
-# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78
------BEGIN CERTIFICATE-----
-MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD
-VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0
-ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G
-CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y
-OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx
-FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp
-Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o
-dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP
-kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc
-cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U
-fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7
-N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC
-xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1
-+rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
-A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM
-Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG
-SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h
-mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk
-ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775
-tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c
-2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t
-HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW
------END CERTIFICATE-----
-
-# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3
-# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3
-# Label: "GlobalSign Root CA - R3"
-# Serial: 4835703278459759426209954
-# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28
-# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad
-# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b
------BEGIN CERTIFICATE-----
-MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G
-A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp
-Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4
-MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG
-A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8
-RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT
-gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm
-KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd
-QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ
-XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw
-DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o
-LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU
-RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp
-jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK
-6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX
-mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs
-Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH
-WD9f
------END CERTIFICATE-----
-
-# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068
-# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068
-# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068"
-# Serial: 6047274297262753887
-# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3
-# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa
-# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef
------BEGIN CERTIFICATE-----
-MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE
-BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h
-cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy
-MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg
-Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi
-MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9
-thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM
-cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG
-L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i
-NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h
-X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b
-m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy
-Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja
-EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T
-KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF
-6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh
-OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD
-VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD
-VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
-cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv
-ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl
-AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF
-661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9
-am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1
-ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481
-PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS
-3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k
-SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF
-3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM
-ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g
-StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz
-Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB
-jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V
------END CERTIFICATE-----
-
-# Issuer: CN=Izenpe.com O=IZENPE S.A.
-# Subject: CN=Izenpe.com O=IZENPE S.A.
-# Label: "Izenpe.com"
-# Serial: 917563065490389241595536686991402621
-# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73
-# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19
-# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f
------BEGIN CERTIFICATE-----
-MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4
-MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6
-ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD
-VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j
-b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq
-scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO
-xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H
-LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX
-uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD
-yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+
-JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q
-rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN
-BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L
-hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB
-QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+
-HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu
-Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg
-QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB
-BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx
-MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
-AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA
-A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb
-laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56
-awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo
-JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw
-LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT
-VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk
-LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb
-UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/
-QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+
-naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls
-QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==
------END CERTIFICATE-----
-
-# Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A.
-# Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A.
-# Label: "Chambers of Commerce Root - 2008"
-# Serial: 11806822484801597146
-# MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7
-# SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c
-# SHA256 Fingerprint: 06:3e:4a:fa:c4:91:df:d3:32:f3:08:9b:85:42:e9:46:17:d8:93:d7:fe:94:4e:10:a7:93:7e:e2:9d:96:93:c0
------BEGIN CERTIFICATE-----
-MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD
-VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0
-IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3
-MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz
-IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz
-MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj
-dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw
-EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp
-MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G
-CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9
-28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq
-VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q
-DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR
-5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL
-ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a
-Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl
-UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s
-+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5
-Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj
-ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx
-hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV
-HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1
-+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN
-YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t
-L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy
-ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt
-IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV
-HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w
-DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW
-PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF
-5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1
-glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH
-FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2
-pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD
-xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG
-tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq
-jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De
-fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg
-OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ
-d0jQ
------END CERTIFICATE-----
-
-# Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A.
-# Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A.
-# Label: "Global Chambersign Root - 2008"
-# Serial: 14541511773111788494
-# MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3
-# SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c
-# SHA256 Fingerprint: 13:63:35:43:93:34:a7:69:80:16:a0:d3:24:de:72:28:4e:07:9d:7b:52:20:bb:8f:bd:74:78:16:ee:be:ba:ca
------BEGIN CERTIFICATE-----
-MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD
-VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0
-IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3
-MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD
-aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx
-MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy
-cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG
-A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl
-BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI
-hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed
-KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7
-G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2
-zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4
-ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG
-HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2
-Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V
-yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e
-beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r
-6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh
-wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog
-zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW
-BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr
-ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp
-ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk
-cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt
-YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC
-CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow
-KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI
-hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ
-UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz
-X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x
-fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz
-a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd
-Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd
-SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O
-AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso
-M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge
-v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z
-09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B
------END CERTIFICATE-----
-
-# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc.
-# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc.
-# Label: "Go Daddy Root Certificate Authority - G2"
-# Serial: 0
-# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01
-# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b
-# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da
------BEGIN CERTIFICATE-----
-MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx
-EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT
-EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp
-ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz
-NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH
-EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE
-AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw
-DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD
-E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH
-/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy
-DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh
-GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR
-tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA
-AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE
-FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX
-WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu
-9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr
-gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo
-2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
-LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI
-4uJEvlz36hz1
------END CERTIFICATE-----
-
-# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc.
-# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc.
-# Label: "Starfield Root Certificate Authority - G2"
-# Serial: 0
-# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96
-# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e
-# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5
------BEGIN CERTIFICATE-----
-MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx
-EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
-HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs
-ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw
-MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
-b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj
-aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp
-Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
-ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg
-nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1
-HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N
-Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN
-dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0
-HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO
-BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G
-CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU
-sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3
-4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg
-8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
-pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1
-mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
------END CERTIFICATE-----
-
-# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc.
-# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc.
-# Label: "Starfield Services Root Certificate Authority - G2"
-# Serial: 0
-# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2
-# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f
-# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5
------BEGIN CERTIFICATE-----
-MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx
-EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
-HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs
-ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
-MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD
-VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy
-ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy
-dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p
-OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2
-8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K
-Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe
-hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk
-6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw
-DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q
-AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI
-bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB
-ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z
-qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
-iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn
-0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN
-sSi6
------END CERTIFICATE-----
-
-# Issuer: CN=AffirmTrust Commercial O=AffirmTrust
-# Subject: CN=AffirmTrust Commercial O=AffirmTrust
-# Label: "AffirmTrust Commercial"
-# Serial: 8608355977964138876
-# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7
-# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7
-# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7
------BEGIN CERTIFICATE-----
-MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE
-BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
-dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL
-MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
-cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
-AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP
-Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr
-ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL
-MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1
-yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr
-VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/
-nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
-KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG
-XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj
-vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt
-Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g
-N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC
-nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
------END CERTIFICATE-----
-
-# Issuer: CN=AffirmTrust Networking O=AffirmTrust
-# Subject: CN=AffirmTrust Networking O=AffirmTrust
-# Label: "AffirmTrust Networking"
-# Serial: 8957382827206547757
-# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f
-# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f
-# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b
------BEGIN CERTIFICATE-----
-MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE
-BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
-dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL
-MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
-cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
-AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y
-YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua
-kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL
-QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp
-6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG
-yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i
-QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
-KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO
-tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu
-QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ
-Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u
-olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48
-x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
------END CERTIFICATE-----
-
-# Issuer: CN=AffirmTrust Premium O=AffirmTrust
-# Subject: CN=AffirmTrust Premium O=AffirmTrust
-# Label: "AffirmTrust Premium"
-# Serial: 7893706540734352110
-# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57
-# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27
-# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a
------BEGIN CERTIFICATE-----
-MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE
-BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz
-dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG
-A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U
-cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf
-qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ
-JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ
-+jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS
-s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5
-HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7
-70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG
-V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S
-qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S
-5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia
-C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX
-OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE
-FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
-BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2
-KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
-Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B
-8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ
-MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc
-0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ
-u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF
-u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH
-YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8
-GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO
-RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e
-KeC2uAloGRwYQw==
------END CERTIFICATE-----
-
-# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust
-# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust
-# Label: "AffirmTrust Premium ECC"
-# Serial: 8401224907861490260
-# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d
-# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb
-# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23
------BEGIN CERTIFICATE-----
-MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC
-VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ
-cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ
-BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt
-VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D
-0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9
-ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G
-A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G
-A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs
-aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I
-flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ==
------END CERTIFICATE-----
-
-# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority
-# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority
-# Label: "Certum Trusted Network CA"
-# Serial: 279744
-# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78
-# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e
-# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e
------BEGIN CERTIFICATE-----
-MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM
-MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D
-ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU
-cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3
-WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg
-Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw
-IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B
-AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH
-UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM
-TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU
-BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM
-kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x
-AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV
-HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV
-HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y
-sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL
-I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8
-J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY
-VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
-03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
------END CERTIFICATE-----
-
-# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA
-# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA
-# Label: "TWCA Root Certification Authority"
-# Serial: 1
-# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79
-# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48
-# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44
------BEGIN CERTIFICATE-----
-MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES
-MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU
-V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz
-WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO
-LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm
-aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
-AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE
-AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH
-K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX
-RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z
-rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx
-3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
-HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq
-hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC
-MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls
-XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D
-lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn
-aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ
-YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
------END CERTIFICATE-----
-
-# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2
-# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2
-# Label: "Security Communication RootCA2"
-# Serial: 0
-# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43
-# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74
-# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6
------BEGIN CERTIFICATE-----
-MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl
-MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe
-U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX
-DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy
-dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj
-YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV
-OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr
-zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM
-VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ
-hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO
-ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw
-awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs
-OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3
-DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF
-coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc
-okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8
-t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy
-1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/
-SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
------END CERTIFICATE-----
-
-# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority
-# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority
-# Label: "Hellenic Academic and Research Institutions RootCA 2011"
-# Serial: 0
-# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9
-# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d
-# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71
------BEGIN CERTIFICATE-----
-MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix
-RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1
-dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p
-YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw
-NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK
-EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl
-cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl
-c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB
-BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz
-dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ
-fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns
-bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD
-75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP
-FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV
-HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp
-5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu
-b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA
-A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p
-6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8
-TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7
-dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys
-Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI
-l7WdmplNsDz4SgCbZN2fOUvRJ9e4
------END CERTIFICATE-----
-
-# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967
-# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967
-# Label: "Actalis Authentication Root CA"
-# Serial: 6271844772424770508
-# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6
-# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac
-# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66
------BEGIN CERTIFICATE-----
-MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE
-BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w
-MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290
-IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC
-SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1
-ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB
-MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv
-UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX
-4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9
-KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/
-gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb
-rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ
-51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F
-be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe
-KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F
-v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn
-fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7
-jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz
-ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt
-ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL
-e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70
-jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz
-WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V
-SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j
-pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX
-X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok
-fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R
-K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU
-ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU
-LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT
-LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==
------END CERTIFICATE-----
-
-# Issuer: O=Trustis Limited OU=Trustis FPS Root CA
-# Subject: O=Trustis Limited OU=Trustis FPS Root CA
-# Label: "Trustis FPS Root CA"
-# Serial: 36053640375399034304724988975563710553
-# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d
-# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04
-# SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d
------BEGIN CERTIFICATE-----
-MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF
-MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL
-ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx
-MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc
-MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD
-ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+
-AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH
-iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj
-vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA
-0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB
-OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/
-BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E
-FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01
-GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW
-zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4
-1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE
-f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F
-jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN
-ZetX2fNXlrtIzYE=
------END CERTIFICATE-----
-
-# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327
-# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327
-# Label: "Buypass Class 2 Root CA"
-# Serial: 2
-# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29
-# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99
-# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48
------BEGIN CERTIFICATE-----
-MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd
-MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg
-Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow
-TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw
-HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB
-BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr
-6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV
-L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91
-1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx
-MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ
-QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB
-arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr
-Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi
-FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS
-P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN
-9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP
-AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz
-uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h
-9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s
-A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t
-OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo
-+fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7
-KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2
-DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us
-H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ
-I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7
-5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h
-3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz
-Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA=
------END CERTIFICATE-----
-
-# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327
-# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327
-# Label: "Buypass Class 3 Root CA"
-# Serial: 2
-# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec
-# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57
-# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d
------BEGIN CERTIFICATE-----
-MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd
-MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg
-Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow
-TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw
-HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB
-BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y
-ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E
-N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9
-tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX
-0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c
-/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X
-KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY
-zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS
-O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D
-34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP
-K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3
-AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv
-Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj
-QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV
-cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS
-IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2
-HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa
-O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv
-033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u
-dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE
-kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41
-3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD
-u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq
-4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc=
------END CERTIFICATE-----
-
-# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center
-# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center
-# Label: "T-TeleSec GlobalRoot Class 3"
-# Serial: 1
-# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef
-# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1
-# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd
------BEGIN CERTIFICATE-----
-MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx
-KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd
-BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl
-YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1
-OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy
-aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50
-ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G
-CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN
-8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/
-RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4
-hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5
-ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM
-EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj
-QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1
-A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy
-WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ
-1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30
-6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT
-91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml
-e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p
-TpPDpFQUWw==
------END CERTIFICATE-----
-
-# Issuer: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus
-# Subject: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus
-# Label: "EE Certification Centre Root CA"
-# Serial: 112324828676200291871926431888494945866
-# MD5 Fingerprint: 43:5e:88:d4:7d:1a:4a:7e:fd:84:2e:52:eb:01:d4:6f
-# SHA1 Fingerprint: c9:a8:b9:e7:55:80:5e:58:e3:53:77:a7:25:eb:af:c3:7b:27:cc:d7
-# SHA256 Fingerprint: 3e:84:ba:43:42:90:85:16:e7:75:73:c0:99:2f:09:79:ca:08:4e:46:85:68:1f:f1:95:cc:ba:8a:22:9b:8a:76
------BEGIN CERTIFICATE-----
-MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1
-MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1
-czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG
-CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy
-MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl
-ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS
-b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB
-AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy
-euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO
-bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw
-WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d
-MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE
-1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD
-VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/
-zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB
-BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF
-BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV
-v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG
-E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u
-uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW
-iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v
-GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0=
------END CERTIFICATE-----
-
-# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH
-# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH
-# Label: "D-TRUST Root Class 3 CA 2 2009"
-# Serial: 623603
-# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f
-# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0
-# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1
------BEGIN CERTIFICATE-----
-MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF
-MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD
-bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha
-ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM
-HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB
-BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03
-UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42
-tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R
-ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM
-lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp
-/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G
-A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G
-A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj
-dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy
-MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl
-cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js
-L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL
-BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni
-acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0
-o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K
-zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8
-PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y
-Johw1+qRzT65ysCQblrGXnRl11z+o+I=
------END CERTIFICATE-----
-
-# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH
-# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH
-# Label: "D-TRUST Root Class 3 CA 2 EV 2009"
-# Serial: 623604
-# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6
-# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83
-# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81
------BEGIN CERTIFICATE-----
-MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF
-MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD
-bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw
-NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV
-BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn
-ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0
-3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z
-qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR
-p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8
-HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw
-ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea
-HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw
-Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh
-c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E
-RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt
-dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku
-Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp
-3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05
-nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF
-CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na
-xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX
-KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1
------END CERTIFICATE-----
-
-# Issuer: CN=CA Disig Root R2 O=Disig a.s.
-# Subject: CN=CA Disig Root R2 O=Disig a.s.
-# Label: "CA Disig Root R2"
-# Serial: 10572350602393338211
-# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03
-# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71
-# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03
------BEGIN CERTIFICATE-----
-MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV
-BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu
-MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy
-MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx
-EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw
-ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe
-NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH
-PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I
-x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe
-QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR
-yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO
-QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912
-H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ
-QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD
-i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs
-nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1
-rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud
-DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI
-hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM
-tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf
-GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb
-lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka
-+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal
-TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i
-nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3
-gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr
-G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os
-zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x
-L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL
------END CERTIFICATE-----
-
-# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV
-# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV
-# Label: "ACCVRAIZ1"
-# Serial: 6828503384748696800
-# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02
-# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17
-# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13
------BEGIN CERTIFICATE-----
-MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE
-AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw
-CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ
-BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND
-VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb
-qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY
-HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo
-G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA
-lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr
-IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/
-0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH
-k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47
-4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO
-m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa
-cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl
-uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI
-KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls
-ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG
-AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2
-VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT
-VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG
-CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA
-cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA
-QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA
-7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA
-cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA
-QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA
-czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu
-aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt
-aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud
-DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF
-BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp
-D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU
-JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m
-AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD
-vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms
-tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH
-7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h
-I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA
-h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF
-d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H
-pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7
------END CERTIFICATE-----
-
-# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA
-# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA
-# Label: "TWCA Global Root CA"
-# Serial: 3262
-# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96
-# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65
-# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b
------BEGIN CERTIFICATE-----
-MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx
-EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT
-VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5
-NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT
-B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG
-SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF
-10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz
-0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh
-MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH
-zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc
-46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2
-yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi
-laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP
-oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA
-BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE
-qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm
-4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
-/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL
-1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn
-LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF
-H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo
-RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+
-nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh
-15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW
-6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW
-nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j
-wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz
-aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy
-KwbQBM0=
------END CERTIFICATE-----
-
-# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera
-# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera
-# Label: "TeliaSonera Root CA v1"
-# Serial: 199041966741090107964904287217786801558
-# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c
-# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37
-# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89
------BEGIN CERTIFICATE-----
-MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw
-NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv
-b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD
-VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2
-MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F
-VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1
-7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X
-Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+
-/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs
-81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm
-dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe
-Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu
-sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4
-pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs
-slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ
-arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD
-VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG
-9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl
-dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx
-0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj
-TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed
-Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7
-Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI
-OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7
-vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW
-t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn
-HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx
-SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY=
------END CERTIFICATE-----
-
-# Issuer: CN=E-Tugra Certification Authority O=E-TuÄŸra EBG BiliÅŸim Teknolojileri ve Hizmetleri A.Åž. OU=E-Tugra Sertifikasyon Merkezi
-# Subject: CN=E-Tugra Certification Authority O=E-TuÄŸra EBG BiliÅŸim Teknolojileri ve Hizmetleri A.Åž. OU=E-Tugra Sertifikasyon Merkezi
-# Label: "E-Tugra Certification Authority"
-# Serial: 7667447206703254355
-# MD5 Fingerprint: b8:a1:03:63:b0:bd:21:71:70:8a:6f:13:3a:bb:79:49
-# SHA1 Fingerprint: 51:c6:e7:08:49:06:6e:f3:92:d4:5c:a0:0d:6d:a3:62:8f:c3:52:39
-# SHA256 Fingerprint: b0:bf:d5:2b:b0:d7:d9:bd:92:bf:5d:4d:c1:3d:a2:55:c0:2c:54:2f:37:83:65:ea:89:39:11:f5:5e:55:f2:3c
------BEGIN CERTIFICATE-----
-MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV
-BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC
-aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV
-BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1
-Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz
-MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+
-BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp
-em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN
-ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
-MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY
-B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH
-D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF
-Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo
-q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D
-k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH
-fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut
-dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM
-ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8
-zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn
-rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX
-U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6
-Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5
-XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF
-Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR
-HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY
-GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c
-77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3
-+GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK
-vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6
-FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl
-yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P
-AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD
-y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d
-NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA==
------END CERTIFICATE-----
-
-# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center
-# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center
-# Label: "T-TeleSec GlobalRoot Class 2"
-# Serial: 1
-# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a
-# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9
-# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52
------BEGIN CERTIFICATE-----
-MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx
-KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd
-BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl
-YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1
-OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy
-aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50
-ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G
-CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd
-AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC
-FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi
-1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq
-jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ
-wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj
-QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/
-WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy
-NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC
-uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw
-IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6
-g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN
-9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP
-BSeOE6Fuwg==
------END CERTIFICATE-----
-
-# Issuer: CN=Atos TrustedRoot 2011 O=Atos
-# Subject: CN=Atos TrustedRoot 2011 O=Atos
-# Label: "Atos TrustedRoot 2011"
-# Serial: 6643877497813316402
-# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56
-# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21
-# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74
------BEGIN CERTIFICATE-----
-MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE
-AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG
-EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM
-FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC
-REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp
-Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM
-VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+
-SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ
-4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L
-cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi
-eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV
-HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG
-A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3
-DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j
-vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP
-DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc
-maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D
-lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv
-KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed
------END CERTIFICATE-----
-
-# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited
-# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited
-# Label: "QuoVadis Root CA 1 G3"
-# Serial: 687049649626669250736271037606554624078720034195
-# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab
-# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67
-# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74
------BEGIN CERTIFICATE-----
-MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL
-BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc
-BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00
-MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
-aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG
-SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV
-wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe
-rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341
-68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh
-4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp
-UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o
-abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc
-3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G
-KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt
-hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO
-Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt
-zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
-BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD
-ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC
-MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2
-cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN
-qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5
-YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv
-b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2
-8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k
-NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj
-ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp
-q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt
-nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD
------END CERTIFICATE-----
-
-# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited
-# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited
-# Label: "QuoVadis Root CA 2 G3"
-# Serial: 390156079458959257446133169266079962026824725800
-# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06
-# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36
-# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40
------BEGIN CERTIFICATE-----
-MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL
-BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc
-BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00
-MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
-aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG
-SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf
-qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW
-n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym
-c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+
-O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1
-o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j
-IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq
-IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz
-8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh
-vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l
-7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG
-cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
-BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD
-ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66
-AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC
-roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga
-W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n
-lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE
-+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV
-csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd
-dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg
-KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM
-HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4
-WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M
------END CERTIFICATE-----
-
-# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited
-# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited
-# Label: "QuoVadis Root CA 3 G3"
-# Serial: 268090761170461462463995952157327242137089239581
-# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7
-# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d
-# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46
------BEGIN CERTIFICATE-----
-MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL
-BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc
-BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00
-MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
-aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG
-SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR
-/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu
-FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR
-U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c
-ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR
-FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k
-A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw
-eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl
-sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp
-VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q
-A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+
-ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
-BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD
-ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px
-KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI
-FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv
-oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg
-u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP
-0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf
-3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl
-8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+
-DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN
-PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/
-ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0
------END CERTIFICATE-----
-
-# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com
-# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com
-# Label: "DigiCert Assured ID Root G2"
-# Serial: 15385348160840213938643033620894905419
-# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d
-# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f
-# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85
------BEGIN CERTIFICATE-----
-MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl
-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
-d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
-b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG
-EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
-cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi
-MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA
-n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc
-biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp
-EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA
-bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu
-YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB
-AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW
-BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI
-QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I
-0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni
-lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9
-B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv
-ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo
-IhNzbM8m9Yop5w==
------END CERTIFICATE-----
-
-# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com
-# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com
-# Label: "DigiCert Assured ID Root G3"
-# Serial: 15459312981008553731928384953135426796
-# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb
-# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89
-# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2
------BEGIN CERTIFICATE-----
-MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw
-CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu
-ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg
-RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV
-UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu
-Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq
-hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf
-Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q
-RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
-BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD
-AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY
-JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv
-6pZjamVFkpUBtA==
------END CERTIFICATE-----
-
-# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com
-# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com
-# Label: "DigiCert Global Root G2"
-# Serial: 4293743540046975378534879503202253541
-# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44
-# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4
-# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f
------BEGIN CERTIFICATE-----
-MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh
-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
-d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH
-MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT
-MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
-b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG
-9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI
-2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx
-1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ
-q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz
-tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ
-vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP
-BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV
-5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY
-1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4
-NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG
-Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91
-8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe
-pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl
-MrY=
------END CERTIFICATE-----
-
-# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com
-# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com
-# Label: "DigiCert Global Root G3"
-# Serial: 7089244469030293291760083333884364146
-# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca
-# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e
-# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0
------BEGIN CERTIFICATE-----
-MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw
-CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu
-ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe
-Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw
-EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x
-IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF
-K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG
-fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO
-Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd
-BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx
-AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/
-oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8
-sycX
------END CERTIFICATE-----
-
-# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com
-# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com
-# Label: "DigiCert Trusted Root G4"
-# Serial: 7451500558977370777930084869016614236
-# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49
-# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4
-# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88
------BEGIN CERTIFICATE-----
-MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi
-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
-d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg
-RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV
-UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu
-Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG
-SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y
-ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If
-xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV
-ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO
-DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ
-jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/
-CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi
-EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM
-fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY
-uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK
-chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t
-9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
-hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD
-ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2
-SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd
-+SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc
-fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa
-sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N
-cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N
-0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie
-4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI
-r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1
-/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm
-gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+
------END CERTIFICATE-----
-
-# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited
-# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited
-# Label: "COMODO RSA Certification Authority"
-# Serial: 101909084537582093308941363524873193117
-# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18
-# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4
-# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34
------BEGIN CERTIFICATE-----
-MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB
-hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
-A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV
-BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5
-MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT
-EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
-Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh
-dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR
-6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X
-pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC
-9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV
-/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf
-Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z
-+pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w
-qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah
-SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC
-u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf
-Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq
-crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E
-FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB
-/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl
-wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM
-4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV
-2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna
-FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ
-CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK
-boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke
-jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL
-S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb
-QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl
-0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB
-NVOFBkpdn627G190
------END CERTIFICATE-----
-
-# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network
-# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network
-# Label: "USERTrust RSA Certification Authority"
-# Serial: 2645093764781058787591871645665788717
-# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5
-# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e
-# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2
------BEGIN CERTIFICATE-----
-MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB
-iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
-cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV
-BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw
-MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV
-BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
-aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy
-dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
-AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B
-3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY
-tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/
-Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2
-VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT
-79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6
-c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT
-Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l
-c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee
-UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE
-Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd
-BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G
-A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF
-Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO
-VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3
-ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs
-8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR
-iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze
-Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ
-XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/
-qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB
-VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB
-L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG
-jjxDah2nGN59PRbxYvnKkKj9
------END CERTIFICATE-----
-
-# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network
-# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network
-# Label: "USERTrust ECC Certification Authority"
-# Serial: 123013823720199481456569720443997572134
-# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1
-# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0
-# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a
------BEGIN CERTIFICATE-----
-MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL
-MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl
-eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT
-JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx
-MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT
-Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg
-VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm
-aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo
-I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng
-o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G
-A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD
-VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB
-zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW
-RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=
------END CERTIFICATE-----
-
-# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4
-# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4
-# Label: "GlobalSign ECC Root CA - R4"
-# Serial: 14367148294922964480859022125800977897474
-# MD5 Fingerprint: 20:f0:27:68:d1:7e:a0:9d:0e:e6:2a:ca:df:5c:89:8e
-# SHA1 Fingerprint: 69:69:56:2e:40:80:f4:24:a1:e7:19:9f:14:ba:f3:ee:58:ab:6a:bb
-# SHA256 Fingerprint: be:c9:49:11:c2:95:56:76:db:6c:0a:55:09:86:d7:6e:3b:a0:05:66:7c:44:2c:97:62:b4:fb:b7:73:de:22:8c
------BEGIN CERTIFICATE-----
-MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk
-MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH
-bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX
-DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD
-QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu
-MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ
-FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw
-DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F
-uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX
-kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs
-ewv4n4Q=
------END CERTIFICATE-----
-
-# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5
-# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5
-# Label: "GlobalSign ECC Root CA - R5"
-# Serial: 32785792099990507226680698011560947931244
-# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08
-# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa
-# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24
------BEGIN CERTIFICATE-----
-MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk
-MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH
-bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX
-DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD
-QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu
-MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc
-8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke
-hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD
-VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI
-KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg
-515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO
-xwy8p2Fp8fc74SrL+SvzZpA3
------END CERTIFICATE-----
-
-# Issuer: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden
-# Subject: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden
-# Label: "Staat der Nederlanden Root CA - G3"
-# Serial: 10003001
-# MD5 Fingerprint: 0b:46:67:07:db:10:2f:19:8c:35:50:60:d1:0b:f4:37
-# SHA1 Fingerprint: d8:eb:6b:41:51:92:59:e0:f3:e7:85:00:c0:3d:b6:88:97:c9:ee:fc
-# SHA256 Fingerprint: 3c:4f:b0:b9:5a:b8:b3:00:32:f4:32:b8:6f:53:5f:e1:72:c1:85:d0:fd:39:86:58:37:cf:36:18:7f:a6:f4:28
------BEGIN CERTIFICATE-----
-MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO
-TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh
-dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloX
-DTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl
-ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv
-b3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4yolQP
-cPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WW
-IkYFsO2tx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqX
-xz8ecAgwoNzFs21v0IJyEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFy
-KJLZWyNtZrVtB0LrpjPOktvA9mxjeM3KTj215VKb8b475lRgsGYeCasH/lSJEULR
-9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUurmkVLoR9BvUhTFXFkC4az
-5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU51nus6+N8
-6U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7
-Ngzp07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHP
-bMk7ccHViLVlvMDoFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXt
-BznaqB16nzaeErAMZRKQFWDZJkBE41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTt
-XUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMBAAGjQjBAMA8GA1UdEwEB/wQF
-MAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleuyjWcLhL75Lpd
-INyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD
-U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwp
-LiniyMMB8jPqKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8
-Ipf3YF3qKS9Ysr1YvY2WTxB1v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixp
-gZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA8KCWAg8zxXHzniN9lLf9OtMJgwYh
-/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b8KKaa8MFSu1BYBQw
-0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0rmj1A
-fsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq
-4BZ+Extq1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR
-1VmiiXTTn74eS9fGbbeIJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/
-QFH1T/U67cjF68IeHRaVesd+QnGTbksVtzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM
-94B7IWcnMFk=
------END CERTIFICATE-----
-
-# Issuer: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden
-# Subject: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden
-# Label: "Staat der Nederlanden EV Root CA"
-# Serial: 10000013
-# MD5 Fingerprint: fc:06:af:7b:e8:1a:f1:9a:b4:e8:d2:70:1f:c0:f5:ba
-# SHA1 Fingerprint: 76:e2:7e:c1:4f:db:82:c1:c0:a6:75:b5:05:be:3d:29:b4:ed:db:bb
-# SHA256 Fingerprint: 4d:24:91:41:4c:fe:95:67:46:ec:4c:ef:a6:cf:6f:72:e2:8a:13:29:43:2f:9d:8a:90:7a:c4:cb:5d:ad:c1:5a
------BEGIN CERTIFICATE-----
-MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO
-TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh
-dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y
-MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg
-TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS
-b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS
-M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC
-UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d
-Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p
-rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l
-pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb
-j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC
-KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS
-/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X
-cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH
-1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP
-px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB
-/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7
-MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI
-eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u
-2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS
-v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC
-wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy
-CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e
-vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6
-Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa
-Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL
-eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8
-FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc
-7uzXLg==
------END CERTIFICATE-----
-
-# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust
-# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust
-# Label: "IdenTrust Commercial Root CA 1"
-# Serial: 13298821034946342390520003877796839426
-# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7
-# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25
-# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae
------BEGIN CERTIFICATE-----
-MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK
-MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu
-VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw
-MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw
-JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG
-SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT
-3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU
-+ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp
-S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1
-bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi
-T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL
-vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK
-Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK
-dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT
-c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv
-l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N
-iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
-/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD
-ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH
-6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt
-LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93
-nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3
-+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK
-W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT
-AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq
-l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG
-4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ
-mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A
-7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H
------END CERTIFICATE-----
-
-# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust
-# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust
-# Label: "IdenTrust Public Sector Root CA 1"
-# Serial: 13298821034946342390521976156843933698
-# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba
-# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd
-# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f
------BEGIN CERTIFICATE-----
-MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN
-MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu
-VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN
-MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0
-MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi
-MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7
-ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy
-RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS
-bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF
-/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R
-3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw
-EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy
-9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V
-GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ
-2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV
-WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD
-W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
-BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN
-AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj
-t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV
-DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9
-TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G
-lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW
-mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df
-WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5
-+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ
-tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA
-GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv
-8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c
------END CERTIFICATE-----
-
-# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only
-# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only
-# Label: "Entrust Root Certification Authority - G2"
-# Serial: 1246989352
-# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2
-# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4
-# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39
------BEGIN CERTIFICATE-----
-MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC
-VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50
-cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs
-IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz
-dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy
-NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu
-dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt
-dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0
-aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj
-YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
-AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T
-RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN
-cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW
-wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1
-U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0
-jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP
-BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN
-BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/
-jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ
-Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v
-1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R
-nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH
-VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g==
------END CERTIFICATE-----
-
-# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only
-# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only
-# Label: "Entrust Root Certification Authority - EC1"
-# Serial: 51543124481930649114116133369
-# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc
-# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47
-# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5
------BEGIN CERTIFICATE-----
-MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG
-A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3
-d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu
-dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq
-RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy
-MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD
-VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0
-L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g
-Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD
-ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi
-A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt
-ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH
-Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O
-BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC
-R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX
-hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G
------END CERTIFICATE-----
-
-# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority
-# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority
-# Label: "CFCA EV ROOT"
-# Serial: 407555286
-# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30
-# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83
-# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd
------BEGIN CERTIFICATE-----
-MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD
-TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y
-aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx
-MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j
-aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP
-T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03
-sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL
-TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5
-/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp
-7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz
-EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt
-hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP
-a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot
-aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg
-TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV
-PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv
-cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL
-tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd
-BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB
-ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT
-ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL
-jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS
-ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy
-P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19
-xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d
-Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN
-5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe
-/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z
-AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ
-5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su
------END CERTIFICATE-----
-
-# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed
-# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed
-# Label: "OISTE WISeKey Global Root GB CA"
-# Serial: 157768595616588414422159278966750757568
-# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d
-# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed
-# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6
------BEGIN CERTIFICATE-----
-MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt
-MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg
-Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i
-YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x
-CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG
-b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh
-bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3
-HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx
-WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX
-1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk
-u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P
-99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r
-M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
-AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB
-BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh
-cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5
-gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO
-ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf
-aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic
-Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM=
------END CERTIFICATE-----
-
-# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A.
-# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A.
-# Label: "SZAFIR ROOT CA2"
-# Serial: 357043034767186914217277344587386743377558296292
-# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99
-# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de
-# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe
------BEGIN CERTIFICATE-----
-MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL
-BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6
-ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw
-NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L
-cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg
-Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN
-QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT
-3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw
-3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6
-3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5
-BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN
-XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD
-AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF
-AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw
-8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG
-nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP
-oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy
-d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg
-LvWpCz/UXeHPhJ/iGcJfitYgHuNztw==
------END CERTIFICATE-----
-
-# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority
-# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority
-# Label: "Certum Trusted Network CA 2"
-# Serial: 44979900017204383099463764357512596969
-# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2
-# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92
-# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04
------BEGIN CERTIFICATE-----
-MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB
-gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu
-QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG
-A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz
-OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ
-VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp
-ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3
-b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA
-DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn
-0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB
-OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE
-fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E
-Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m
-o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i
-sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW
-OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez
-Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS
-adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n
-3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
-AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC
-AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ
-F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf
-CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29
-XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm
-djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/
-WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb
-AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq
-P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko
-b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj
-XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P
-5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi
-DrW5viSP
------END CERTIFICATE-----
-
-# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority
-# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority
-# Label: "Hellenic Academic and Research Institutions RootCA 2015"
-# Serial: 0
-# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce
-# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6
-# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36
------BEGIN CERTIFICATE-----
-MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix
-DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k
-IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT
-N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v
-dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG
-A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh
-ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx
-QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1
-dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
-AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA
-4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0
-AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10
-4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C
-ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV
-9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD
-gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6
-Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq
-NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko
-LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc
-Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV
-HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd
-ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I
-XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI
-M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot
-9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V
-Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea
-j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh
-X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ
-l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf
-bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4
-pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK
-e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0
-vm9qp/UsQu0yrbYhnr68
------END CERTIFICATE-----
-
-# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority
-# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority
-# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015"
-# Serial: 0
-# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef
-# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66
-# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33
------BEGIN CERTIFICATE-----
-MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN
-BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl
-c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl
-bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv
-b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ
-BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj
-YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5
-MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0
-dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg
-QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa
-jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC
-MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi
-C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep
-lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof
-TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR
------END CERTIFICATE-----
-
-# Issuer: CN=ISRG Root X1 O=Internet Security Research Group
-# Subject: CN=ISRG Root X1 O=Internet Security Research Group
-# Label: "ISRG Root X1"
-# Serial: 172886928669790476064670243504169061120
-# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e
-# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8
-# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6
------BEGIN CERTIFICATE-----
-MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
-TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
-cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4
-WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu
-ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY
-MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc
-h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
-0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U
-A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW
-T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH
-B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC
-B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv
-KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn
-OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn
-jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw
-qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI
-rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
-HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq
-hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
-ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
-3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK
-NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5
-ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
-TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC
-jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc
-oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq
-4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
-mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
-emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
------END CERTIFICATE-----
-
-# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM
-# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM
-# Label: "AC RAIZ FNMT-RCM"
-# Serial: 485876308206448804701554682760554759
-# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d
-# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20
-# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa
------BEGIN CERTIFICATE-----
-MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx
-CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ
-WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ
-BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG
-Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/
-yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf
-BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz
-WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF
-tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z
-374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC
-IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL
-mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7
-wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS
-MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2
-ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet
-UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw
-AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H
-YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3
-LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD
-nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1
-RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM
-LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf
-77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N
-JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm
-fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp
-6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp
-1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B
-9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok
-RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv
-uu8wd+RU4riEmViAqhOLUTpPSPaLtrM=
------END CERTIFICATE-----
-
-# Issuer: CN=Amazon Root CA 1 O=Amazon
-# Subject: CN=Amazon Root CA 1 O=Amazon
-# Label: "Amazon Root CA 1"
-# Serial: 143266978916655856878034712317230054538369994
-# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6
-# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16
-# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e
------BEGIN CERTIFICATE-----
-MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF
-ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6
-b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL
-MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv
-b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj
-ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM
-9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw
-IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6
-VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L
-93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm
-jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
-AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA
-A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI
-U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs
-N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv
-o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU
-5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy
-rqXRfboQnoZsG4q5WTP468SQvvG5
------END CERTIFICATE-----
-
-# Issuer: CN=Amazon Root CA 2 O=Amazon
-# Subject: CN=Amazon Root CA 2 O=Amazon
-# Label: "Amazon Root CA 2"
-# Serial: 143266982885963551818349160658925006970653239
-# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66
-# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a
-# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4
------BEGIN CERTIFICATE-----
-MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF
-ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6
-b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL
-MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv
-b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK
-gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ
-W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg
-1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K
-8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r
-2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me
-z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR
-8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj
-mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz
-7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6
-+XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI
-0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB
-Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm
-UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2
-LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY
-+gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS
-k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl
-7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm
-btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl
-urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+
-fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63
-n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE
-76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H
-9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT
-4PsJYGw=
------END CERTIFICATE-----
-
-# Issuer: CN=Amazon Root CA 3 O=Amazon
-# Subject: CN=Amazon Root CA 3 O=Amazon
-# Label: "Amazon Root CA 3"
-# Serial: 143266986699090766294700635381230934788665930
-# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87
-# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e
-# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4
------BEGIN CERTIFICATE-----
-MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5
-MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g
-Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG
-A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg
-Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl
-ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j
-QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr
-ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr
-BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM
-YyRIHN8wfdVoOw==
------END CERTIFICATE-----
-
-# Issuer: CN=Amazon Root CA 4 O=Amazon
-# Subject: CN=Amazon Root CA 4 O=Amazon
-# Label: "Amazon Root CA 4"
-# Serial: 143266989758080763974105200630763877849284878
-# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd
-# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be
-# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92
------BEGIN CERTIFICATE-----
-MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5
-MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g
-Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG
-A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg
-Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi
-9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk
-M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB
-/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB
-MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw
-CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW
-1KyLa2tJElMzrdfkviT8tQp21KW8EA==
------END CERTIFICATE-----
-
-# Issuer: CN=LuxTrust Global Root 2 O=LuxTrust S.A.
-# Subject: CN=LuxTrust Global Root 2 O=LuxTrust S.A.
-# Label: "LuxTrust Global Root 2"
-# Serial: 59914338225734147123941058376788110305822489521
-# MD5 Fingerprint: b2:e1:09:00:61:af:f7:f1:91:6f:c4:ad:8d:5e:3b:7c
-# SHA1 Fingerprint: 1e:0e:56:19:0a:d1:8b:25:98:b2:04:44:ff:66:8a:04:17:99:5f:3f
-# SHA256 Fingerprint: 54:45:5f:71:29:c2:0b:14:47:c4:18:f9:97:16:8f:24:c5:8f:c5:02:3b:f5:da:5b:e2:eb:6e:1d:d8:90:2e:d5
------BEGIN CERTIFICATE-----
-MIIFwzCCA6ugAwIBAgIUCn6m30tEntpqJIWe5rgV0xZ/u7EwDQYJKoZIhvcNAQEL
-BQAwRjELMAkGA1UEBhMCTFUxFjAUBgNVBAoMDUx1eFRydXN0IFMuQS4xHzAdBgNV
-BAMMFkx1eFRydXN0IEdsb2JhbCBSb290IDIwHhcNMTUwMzA1MTMyMTU3WhcNMzUw
-MzA1MTMyMTU3WjBGMQswCQYDVQQGEwJMVTEWMBQGA1UECgwNTHV4VHJ1c3QgUy5B
-LjEfMB0GA1UEAwwWTHV4VHJ1c3QgR2xvYmFsIFJvb3QgMjCCAiIwDQYJKoZIhvcN
-AQEBBQADggIPADCCAgoCggIBANeFl78RmOnwYoNMPIf5U2o3C/IPPIfOb9wmKb3F
-ibrJgz337spbxm1Jc7TJRqMbNBM/wYlFV/TZsfs2ZUv7COJIcRHIbjuend+JZTem
-hfY7RBi2xjcwYkSSl2l9QjAk5A0MiWtj3sXh306pFGxT4GHO9hcvHTy95iJMHZP1
-EMShduxq3sVs35a0VkBCwGKSMKEtFZSg0iAGCW5qbeXrt77U8PEVfIvmTroTzEsn
-Xpk8F12PgX8zPU/TPxvsXD/wPEx1bvKm1Z3aLQdjAsZy6ZS8TEmVT4hSyNvoaYL4
-zDRbIvCGp4m9SAptZoFtyMhk+wHh9OHe2Z7d21vUKpkmFRseTJIpgp7VkoGSQXAZ
-96Tlk0u8d2cx3Rz9MXANF5kM+Qw5GSoXtTBxVdUPrljhPS80m8+f9niFwpN6cj5m
-j5wWEWCPnolvZ77gR1o7DJpni89Gxq44o/KnvObWhWszJHAiS8sIm7vI+AIpHb4g
-DEa/a4ebsypmQjVGbKq6rfmYe+lQVRQxv7HaLe2ArWgk+2mr2HETMOZns4dA/Yl+
-8kPREd8vZS9kzl8UubG/Mb2HeFpZZYiq/FkySIbWTLkpS5XTdvN3JW1CHDiDTf2j
-X5t/Lax5Gw5CMZdjpPuKadUiDTSQMC6otOBttpSsvItO13D8xTiOZCXhTTmQzsmH
-hFhxAgMBAAGjgagwgaUwDwYDVR0TAQH/BAUwAwEB/zBCBgNVHSAEOzA5MDcGByuB
-KwEBAQowLDAqBggrBgEFBQcCARYeaHR0cHM6Ly9yZXBvc2l0b3J5Lmx1eHRydXN0
-Lmx1MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBT/GCh2+UgFLKGu8SsbK7JT
-+Et8szAdBgNVHQ4EFgQU/xgodvlIBSyhrvErGyuyU/hLfLMwDQYJKoZIhvcNAQEL
-BQADggIBAGoZFO1uecEsh9QNcH7X9njJCwROxLHOk3D+sFTAMs2ZMGQXvw/l4jP9
-BzZAcg4atmpZ1gDlaCDdLnINH2pkMSCEfUmmWjfrRcmF9dTHF5kH5ptV5AzoqbTO
-jFu1EVzPig4N1qx3gf4ynCSecs5U89BvolbW7MM3LGVYvlcAGvI1+ut7MV3CwRI9
-loGIlonBWVx65n9wNOeD4rHh4bhY79SV5GCc8JaXcozrhAIuZY+kt9J/Z93I055c
-qqmkoCUUBpvsT34tC38ddfEz2O3OuHVtPlu5mB0xDVbYQw8wkbIEa91WvpWAVWe+
-2M2D2RjuLg+GLZKecBPs3lHJQ3gCpU3I+V/EkVhGFndadKpAvAefMLmx9xIX3eP/
-JEAdemrRTxgKqpAd60Ae36EeRJIQmvKN4dFLRp7oRUKX6kWZ8+xm1QL68qZKJKre
-zrnK+T+Tb/mjuuqlPpmt/f97mfVl7vBZKGfXkJWkE4SphMHozs51k2MavDzq1WQf
-LSoSOcbDWjLtR5EWDrw4wVDej8oqkDQc7kGUnF4ZLvhFSZl0kbAEb+MEWrGrKqv+
-x9CWttrhSmQGbmBNvUJO/3jaJMobtNeWOWyu8Q6qp31IiyBMz2TWuJdGsE7RKlY6
-oJO9r4Ak4Ap+58rVyuiFVdw2KuGUaJPHZnJED4AhMmwlxyOAgwrr
------END CERTIFICATE-----
-
-# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM
-# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM
-# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1"
-# Serial: 1
-# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49
-# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca
-# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16
------BEGIN CERTIFICATE-----
-MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx
-GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp
-bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w
-KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0
-BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy
-dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG
-EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll
-IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU
-QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT
-TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg
-LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7
-a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr
-LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr
-N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X
-YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/
-iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f
-AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH
-V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL
-BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh
-AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf
-IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4
-lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c
-8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf
-lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM=
------END CERTIFICATE-----
-
-# Issuer: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD.
-# Subject: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD.
-# Label: "GDCA TrustAUTH R5 ROOT"
-# Serial: 9009899650740120186
-# MD5 Fingerprint: 63:cc:d9:3d:34:35:5c:6f:53:a3:e2:08:70:48:1f:b4
-# SHA1 Fingerprint: 0f:36:38:5b:81:1a:25:c3:9b:31:4e:83:ca:e9:34:66:70:cc:74:b4
-# SHA256 Fingerprint: bf:ff:8f:d0:44:33:48:7d:6a:8a:a6:0c:1a:29:76:7a:9f:c2:bb:b0:5e:42:0f:71:3a:13:b9:92:89:1d:38:93
------BEGIN CERTIFICATE-----
-MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE
-BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ
-IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0
-MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV
-BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w
-HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF
-AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj
-Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj
-TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u
-KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj
-qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm
-MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12
-ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP
-zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk
-L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC
-jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA
-HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC
-AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB
-/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg
-p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm
-DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5
-COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry
-L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf
-JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg
-IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io
-2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV
-09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ
-XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq
-T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe
-MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g==
------END CERTIFICATE-----
-
-# Issuer: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority
-# Subject: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority
-# Label: "TrustCor RootCert CA-1"
-# Serial: 15752444095811006489
-# MD5 Fingerprint: 6e:85:f1:dc:1a:00:d3:22:d5:b2:b2:ac:6b:37:05:45
-# SHA1 Fingerprint: ff:bd:cd:e7:82:c8:43:5e:3c:6f:26:86:5c:ca:a8:3a:45:5b:c3:0a
-# SHA256 Fingerprint: d4:0e:9c:86:cd:8f:e4:68:c1:77:69:59:f4:9e:a7:74:fa:54:86:84:b6:c4:06:f3:90:92:61:f4:dc:e2:57:5c
------BEGIN CERTIFICATE-----
-MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYD
-VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk
-MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U
-cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29y
-IFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkxMjMxMTcyMzE2WjCB
-pDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFuYW1h
-IENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUG
-A1UECwweVHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZU
-cnVzdENvciBSb290Q2VydCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
-CgKCAQEAv463leLCJhJrMxnHQFgKq1mqjQCj/IDHUHuO1CAmujIS2CNUSSUQIpid
-RtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4pQa81QBeCQryJ3pS/C3V
-seq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0JEsq1pme
-9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CV
-EY4hgLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorW
-hnAbJN7+KIor0Gqw/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/
-DeOxCbeKyKsZn3MzUOcwHwYDVR0jBBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcw
-DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD
-ggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5mDo4Nvu7Zp5I
-/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf
-ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZ
-yonnMlo2HD6CqFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djts
-L1Ac59v2Z3kf9YKVmgenFK+P3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdN
-zl/HHk484IkzlQsPpTLWPFp5LBk=
------END CERTIFICATE-----
-
-# Issuer: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority
-# Subject: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority
-# Label: "TrustCor RootCert CA-2"
-# Serial: 2711694510199101698
-# MD5 Fingerprint: a2:e1:f8:18:0b:ba:45:d5:c7:41:2a:bb:37:52:45:64
-# SHA1 Fingerprint: b8:be:6d:cb:56:f1:55:b9:63:d4:12:ca:4e:06:34:c7:94:b2:1c:c0
-# SHA256 Fingerprint: 07:53:e9:40:37:8c:1b:d5:e3:83:6e:39:5d:ae:a5:cb:83:9e:50:46:f1:bd:0e:ae:19:51:cf:10:fe:c7:c9:65
------BEGIN CERTIFICATE-----
-MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNV
-BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw
-IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy
-dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEfMB0GA1UEAwwWVHJ1c3RDb3Ig
-Um9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEyMzExNzI2MzlaMIGk
-MQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEg
-Q2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYD
-VQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRy
-dXN0Q29yIFJvb3RDZXJ0IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
-AoICAQCnIG7CKqJiJJWQdsg4foDSq8GbZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+
-QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9NkRvRUqdw6VC0xK5mC8tkq
-1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1oYxOdqHp
-2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nK
-DOObXUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hape
-az6LMvYHL1cEksr1/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF
-3wP+TfSvPd9cW436cOGlfifHhi5qjxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88
-oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQPeSghYA2FFn3XVDjxklb9tTNM
-g9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+CtgrKAmrhQhJ8Z3
-mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh
-8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAd
-BgNVHQ4EFgQU2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6U
-nrybPZx9mCAZ5YwwYrIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYw
-DQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/hOsh80QA9z+LqBrWyOrsGS2h60COX
-dKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnpkpfbsEZC89NiqpX+
-MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv2wnL
-/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RX
-CI/hOWB3S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYa
-ZH9bDTMJBzN7Bj8RpFxwPIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW
-2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dvDDqPys/cA8GiCcjl/YBeyGBCARsaU1q7
-N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYURpFHmygk71dSTlxCnKr3
-Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANExdqtvArB
-As8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp
-5KeXRKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu
-1uwJ
------END CERTIFICATE-----
-
-# Issuer: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority
-# Subject: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority
-# Label: "TrustCor ECA-1"
-# Serial: 9548242946988625984
-# MD5 Fingerprint: 27:92:23:1d:0a:f5:40:7c:e9:e6:6b:9d:d8:f5:e7:6c
-# SHA1 Fingerprint: 58:d1:df:95:95:67:6b:63:c0:f0:5b:1c:17:4d:8b:84:0b:c8:78:bd
-# SHA256 Fingerprint: 5a:88:5d:b1:9c:01:d9:12:c5:75:93:88:93:8c:af:bb:df:03:1a:b2:d4:8e:91:ee:15:58:9b:42:97:1d:03:9c
------BEGIN CERTIFICATE-----
-MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYD
-VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk
-MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U
-cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFzAVBgNVBAMMDlRydXN0Q29y
-IEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3MjgwN1owgZwxCzAJBgNV
-BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw
-IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy
-dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3Ig
-RUNBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb
-3w9U73NjKYKtR8aja+3+XzP4Q1HpGjORMRegdMTUpwHmspI+ap3tDvl0mEDTPwOA
-BoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23xFUfJ3zSCNV2HykVh0A5
-3ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmcp0yJF4Ou
-owReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/
-wZ0+fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZF
-ZtS6mFjBAgMBAAGjYzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAf
-BgNVHSMEGDAWgBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/
-MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEABT41XBVwm8nHc2Fv
-civUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u/ukZMjgDfxT2
-AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F
-hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50
-soIipX1TH0XsJ5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BI
-WJZpTdwHjFGTot+fDz2LYLSCjaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1Wi
-tJ/X5g==
------END CERTIFICATE-----
-
-# Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation
-# Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation
-# Label: "SSL.com Root Certification Authority RSA"
-# Serial: 8875640296558310041
-# MD5 Fingerprint: 86:69:12:c0:70:f1:ec:ac:ac:c2:d5:bc:a5:5b:a1:29
-# SHA1 Fingerprint: b7:ab:33:08:d1:ea:44:77:ba:14:80:12:5a:6f:bd:a9:36:49:0c:bb
-# SHA256 Fingerprint: 85:66:6a:56:2e:e0:be:5c:e9:25:c1:d8:89:0a:6f:76:a8:7e:c1:6d:4d:7d:5f:29:ea:74:19:cf:20:12:3b:69
------BEGIN CERTIFICATE-----
-MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE
-BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK
-DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp
-Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz
-OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv
-dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv
-bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN
-AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R
-xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX
-qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC
-C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3
-6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh
-/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF
-YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E
-JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc
-US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8
-ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm
-+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi
-M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV
-HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G
-A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV
-cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc
-Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs
-PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/
-q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0
-cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr
-a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I
-H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y
-K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu
-nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf
-oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY
-Ic2wBlX7Jz9TkHCpBB5XJ7k=
------END CERTIFICATE-----
-
-# Issuer: CN=SSL.com Root Certification Authority ECC O=SSL Corporation
-# Subject: CN=SSL.com Root Certification Authority ECC O=SSL Corporation
-# Label: "SSL.com Root Certification Authority ECC"
-# Serial: 8495723813297216424
-# MD5 Fingerprint: 2e:da:e4:39:7f:9c:8f:37:d1:70:9f:26:17:51:3a:8e
-# SHA1 Fingerprint: c3:19:7c:39:24:e6:54:af:1b:c4:ab:20:95:7a:e2:c3:0e:13:02:6a
-# SHA256 Fingerprint: 34:17:bb:06:cc:60:07:da:1b:96:1c:92:0b:8a:b4:ce:3f:ad:82:0e:4a:a3:0b:9a:cb:c4:a7:4e:bd:ce:bc:65
------BEGIN CERTIFICATE-----
-MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC
-VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T
-U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0
-aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz
-WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0
-b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS
-b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB
-BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI
-7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg
-CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud
-EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD
-VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T
-kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+
-gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl
------END CERTIFICATE-----
-
-# Issuer: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation
-# Subject: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation
-# Label: "SSL.com EV Root Certification Authority RSA R2"
-# Serial: 6248227494352943350
-# MD5 Fingerprint: e1:1e:31:58:1a:ae:54:53:02:f6:17:6a:11:7b:4d:95
-# SHA1 Fingerprint: 74:3a:f0:52:9b:d0:32:a0:f4:4a:83:cd:d4:ba:a9:7b:7c:2e:c4:9a
-# SHA256 Fingerprint: 2e:7b:f1:6c:c2:24:85:a7:bb:e2:aa:86:96:75:07:61:b0:ae:39:be:3b:2f:e9:d0:cc:6d:4e:f7:34:91:42:5c
------BEGIN CERTIFICATE-----
-MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV
-BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE
-CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy
-dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy
-MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G
-A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD
-DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy
-MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq
-M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf
-OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa
-4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9
-HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR
-aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA
-b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ
-Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV
-PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO
-pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu
-UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY
-MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV
-HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4
-9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW
-s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5
-Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg
-cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM
-79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz
-/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt
-ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm
-Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK
-QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ
-w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi
-S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07
-mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w==
------END CERTIFICATE-----
-
-# Issuer: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation
-# Subject: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation
-# Label: "SSL.com EV Root Certification Authority ECC"
-# Serial: 3182246526754555285
-# MD5 Fingerprint: 59:53:22:65:83:42:01:54:c0:ce:42:b9:5a:7c:f2:90
-# SHA1 Fingerprint: 4c:dd:51:a3:d1:f5:20:32:14:b0:c6:c5:32:23:03:91:c7:46:42:6d
-# SHA256 Fingerprint: 22:a2:c1:f7:bd:ed:70:4c:c1:e7:01:b5:f4:08:c3:10:88:0f:e9:56:b5:de:2a:4a:44:f9:9c:87:3a:25:a7:c8
------BEGIN CERTIFICATE-----
-MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC
-VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T
-U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp
-Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx
-NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv
-dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv
-bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49
-AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA
-VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku
-WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP
-MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX
-5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ
-ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg
-h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg==
------END CERTIFICATE-----
-
-# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6
-# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6
-# Label: "GlobalSign Root CA - R6"
-# Serial: 1417766617973444989252670301619537
-# MD5 Fingerprint: 4f:dd:07:e4:d4:22:64:39:1e:0c:37:42:ea:d1:c6:ae
-# SHA1 Fingerprint: 80:94:64:0e:b5:a7:a1:ca:11:9c:1f:dd:d5:9f:81:02:63:a7:fb:d1
-# SHA256 Fingerprint: 2c:ab:ea:fe:37:d0:6c:a2:2a:ba:73:91:c0:03:3d:25:98:29:52:c4:53:64:73:49:76:3a:3a:b5:ad:6c:cf:69
------BEGIN CERTIFICATE-----
-MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg
-MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh
-bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx
-MjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET
-MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ
-KoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI
-xutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k
-ZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD
-aNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw
-LnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw
-1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX
-k7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2
-SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h
-bguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n
-WUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY
-rZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce
-MgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD
-AQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu
-bAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN
-nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt
-Ixg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61
-55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj
-vUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf
-cDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz
-oHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp
-nOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs
-pA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v
-JJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R
-8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4
-5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA=
------END CERTIFICATE-----
-
-# Issuer: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed
-# Subject: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed
-# Label: "OISTE WISeKey Global Root GC CA"
-# Serial: 44084345621038548146064804565436152554
-# MD5 Fingerprint: a9:d6:b9:2d:2f:93:64:f8:a5:69:ca:91:e9:68:07:23
-# SHA1 Fingerprint: e0:11:84:5e:34:de:be:88:81:b9:9c:f6:16:26:d1:96:1f:c3:b9:31
-# SHA256 Fingerprint: 85:60:f9:1c:36:24:da:ba:95:70:b5:fe:a0:db:e3:6f:f1:1a:83:23:be:94:86:85:4f:b3:f3:4a:55:71:19:8d
------BEGIN CERTIFICATE-----
-MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQsw
-CQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91
-bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwg
-Um9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRaFw00MjA1MDkwOTU4MzNaMG0xCzAJ
-BgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBGb3Vu
-ZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBS
-b290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4ni
-eUqjFqdrVCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4W
-p2OQ0jnUsYd4XxiWD1AbNTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8E
-BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7T
-rYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV
-57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQg
-Mgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9
------END CERTIFICATE-----
-
-# Issuer: CN=GTS Root R1 O=Google Trust Services LLC
-# Subject: CN=GTS Root R1 O=Google Trust Services LLC
-# Label: "GTS Root R1"
-# Serial: 146587175971765017618439757810265552097
-# MD5 Fingerprint: 82:1a:ef:d4:d2:4a:f2:9f:e2:3d:97:06:14:70:72:85
-# SHA1 Fingerprint: e1:c9:50:e6:ef:22:f8:4c:56:45:72:8b:92:20:60:d7:d5:a7:a3:e8
-# SHA256 Fingerprint: 2a:57:54:71:e3:13:40:bc:21:58:1c:bd:2c:f1:3e:15:84:63:20:3e:ce:94:bc:f9:d3:cc:19:6b:f0:9a:54:72
------BEGIN CERTIFICATE-----
-MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBH
-MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM
-QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy
-MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl
-cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEB
-AQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM
-f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vX
-mX7wCl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7
-zUjwTcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0P
-fyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtc
-vfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4
-Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUsp
-zBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOO
-Rc92wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYW
-k70paDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+
-DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgF
-lQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV
-HQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBADiW
-Cu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1
-d5iyfNm9dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6Z
-XPYfcX3v73svfuo21pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZR
-gyFmxhE+885H7pwoHyXa/6xmld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3
-d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL07q9bgsiG1eGZbYwE8na6SfZu6W0eX6Dv
-J4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdljUEn2NIVq4BjFbkerQUIpm/Zg
-DdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0dzpqPJeaAcWErtXvM
-+SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwlfnuzCdyy
-F62ARPBopY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9
-SQ98POyDGCBDTtWTurQ0sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdws
-E3PYJ/HQcu51OyLemGhmW/HGY0dVHLqlCFF1pkgl
------END CERTIFICATE-----
-
-# Issuer: CN=GTS Root R2 O=Google Trust Services LLC
-# Subject: CN=GTS Root R2 O=Google Trust Services LLC
-# Label: "GTS Root R2"
-# Serial: 146587176055767053814479386953112547951
-# MD5 Fingerprint: 44:ed:9a:0e:a4:09:3b:00:f2:ae:4c:a3:c6:61:b0:8b
-# SHA1 Fingerprint: d2:73:96:2a:2a:5e:39:9f:73:3f:e1:c7:1e:64:3f:03:38:34:fc:4d
-# SHA256 Fingerprint: c4:5d:7b:b0:8e:6d:67:e6:2e:42:35:11:0b:56:4e:5f:78:fd:92:ef:05:8c:84:0a:ea:4e:64:55:d7:58:5c:60
------BEGIN CERTIFICATE-----
-MIIFWjCCA0KgAwIBAgIQbkepxlqz5yDFMJo/aFLybzANBgkqhkiG9w0BAQwFADBH
-MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM
-QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy
-MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl
-cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEB
-AQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv
-CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3Kg
-GjSY6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9Bu
-XvAuMC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOd
-re7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXu
-PuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1
-mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K
-8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqj
-x5RWIr9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsR
-nTKaG73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0
-kzCqgc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9Ok
-twIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV
-HQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBALZp
-8KZ3/p7uC4Gt4cCpx/k1HUCCq+YEtN/L9x0Pg/B+E02NjO7jMyLDOfxA325BS0JT
-vhaI8dI4XsRomRyYUpOM52jtG2pzegVATX9lO9ZY8c6DR2Dj/5epnGB3GFW1fgiT
-z9D2PGcDFWEJ+YF59exTpJ/JjwGLc8R3dtyDovUMSRqodt6Sm2T4syzFJ9MHwAiA
-pJiS4wGWAqoC7o87xdFtCjMwc3i5T1QWvwsHoaRc5svJXISPD+AVdyx+Jn7axEvb
-pxZ3B7DNdehyQtaVhJ2Gg/LkkM0JR9SLA3DaWsYDQvTtN6LwG1BUSw7YhN4ZKJmB
-R64JGz9I0cNv4rBgF/XuIwKl2gBbbZCr7qLpGzvpx0QnRY5rn/WkhLx3+WuXrD5R
-RaIRpsyF7gpo8j5QOHokYh4XIDdtak23CZvJ/KRY9bb7nE4Yu5UC56GtmwfuNmsk
-0jmGwZODUNKBRqhfYlcsu2xkiAhu7xNUX90txGdj08+JN7+dIPT7eoOboB6BAFDC
-5AwiWVIQ7UNWhwD4FFKnHYuTjKJNRn8nxnGbJN7k2oaLDX5rIMHAnuFl2GqjpuiF
-izoHCBy69Y9Vmhh1fuXsgWbRIXOhNUQLgD1bnF5vKheW0YMjiGZt5obicDIvUiLn
-yOd/xCxgXS/Dr55FBcOEArf9LAhST4Ldo/DUhgkC
------END CERTIFICATE-----
-
-# Issuer: CN=GTS Root R3 O=Google Trust Services LLC
-# Subject: CN=GTS Root R3 O=Google Trust Services LLC
-# Label: "GTS Root R3"
-# Serial: 146587176140553309517047991083707763997
-# MD5 Fingerprint: 1a:79:5b:6b:04:52:9c:5d:c7:74:33:1b:25:9a:f9:25
-# SHA1 Fingerprint: 30:d4:24:6f:07:ff:db:91:89:8a:0b:e9:49:66:11:eb:8c:5e:46:e5
-# SHA256 Fingerprint: 15:d5:b8:77:46:19:ea:7d:54:ce:1c:a6:d0:b0:c4:03:e0:37:a9:17:f1:31:e8:a0:4e:1e:6b:7a:71:ba:bc:e5
------BEGIN CERTIFICATE-----
-MIICDDCCAZGgAwIBAgIQbkepx2ypcyRAiQ8DVd2NHTAKBggqhkjOPQQDAzBHMQsw
-CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU
-MBIGA1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw
-MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp
-Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQA
-IgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout
-736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2A
-DDL24CejQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud
-DgQWBBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEAgFuk
-fCPAlaUs3L6JbyO5o91lAFJekazInXJ0glMLfalAvWhgxeG4VDvBNhcl2MG9AjEA
-njWSdIUlUfUk7GRSJFClH9voy8l27OyCbvWFGFPouOOaKaqW04MjyaR7YbPMAuhd
------END CERTIFICATE-----
-
-# Issuer: CN=GTS Root R4 O=Google Trust Services LLC
-# Subject: CN=GTS Root R4 O=Google Trust Services LLC
-# Label: "GTS Root R4"
-# Serial: 146587176229350439916519468929765261721
-# MD5 Fingerprint: 5d:b6:6a:c4:60:17:24:6a:1a:99:a8:4b:ee:5e:b4:26
-# SHA1 Fingerprint: 2a:1d:60:27:d9:4a:b1:0a:1c:4d:91:5c:cd:33:a0:cb:3e:2d:54:cb
-# SHA256 Fingerprint: 71:cc:a5:39:1f:9e:79:4b:04:80:25:30:b3:63:e1:21:da:8a:30:43:bb:26:66:2f:ea:4d:ca:7f:c9:51:a4:bd
------BEGIN CERTIFICATE-----
-MIICCjCCAZGgAwIBAgIQbkepyIuUtui7OyrYorLBmTAKBggqhkjOPQQDAzBHMQsw
-CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU
-MBIGA1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw
-MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp
-Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQA
-IgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu
-hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/l
-xKvRHYqjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud
-DgQWBBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNnADBkAjBqUFJ0
-CMRw3J5QdCHojXohw0+WbhXRIjVhLfoIN+4Zba3bssx9BzT1YBkstTTZbyACMANx
-sbqjYAuG7ZoIapVon+Kz4ZNkfF6Tpt95LY2F45TPI11xzPKwTdb+mciUqXWi4w==
------END CERTIFICATE-----
-
-# Issuer: CN=UCA Global G2 Root O=UniTrust
-# Subject: CN=UCA Global G2 Root O=UniTrust
-# Label: "UCA Global G2 Root"
-# Serial: 124779693093741543919145257850076631279
-# MD5 Fingerprint: 80:fe:f0:c4:4a:f0:5c:62:32:9f:1c:ba:78:a9:50:f8
-# SHA1 Fingerprint: 28:f9:78:16:19:7a:ff:18:25:18:aa:44:fe:c1:a0:ce:5c:b6:4c:8a
-# SHA256 Fingerprint: 9b:ea:11:c9:76:fe:01:47:64:c1:be:56:a6:f9:14:b5:a5:60:31:7a:bd:99:88:39:33:82:e5:16:1a:a0:49:3c
------BEGIN CERTIFICATE-----
-MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9
-MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBH
-bG9iYWwgRzIgUm9vdDAeFw0xNjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0x
-CzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlUcnVzdDEbMBkGA1UEAwwSVUNBIEds
-b2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxeYr
-b3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmToni9
-kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzm
-VHqUwCoV8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/R
-VogvGjqNO7uCEeBHANBSh6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDc
-C/Vkw85DvG1xudLeJ1uK6NjGruFZfc8oLTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIj
-tm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/R+zvWr9LesGtOxdQXGLY
-D0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBeKW4bHAyv
-j5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6Dl
-NaBa4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6
-iIis7nCs+dwp4wwcOxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznP
-O6Q0ibd5Ei9Hxeepl2n8pndntd978XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/
-BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFIHEjMz15DD/pQwIX4wV
-ZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo5sOASD0Ee/oj
-L3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5
-1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl
-1qnN3e92mI0ADs0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oU
-b3n09tDh05S60FdRvScFDcH9yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LV
-PtateJLbXDzz2K36uGt/xDYotgIVilQsnLAXc47QN6MUPJiVAAwpBVueSUmxX8fj
-y88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHojhJi6IjMtX9Gl8Cb
-EGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZkbxqg
-DMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI
-+Vg7RE+xygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGy
-YiGqhkCyLmTTX8jjfhFnRR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bX
-UB+K+wb1whnw0A==
------END CERTIFICATE-----
-
-# Issuer: CN=UCA Extended Validation Root O=UniTrust
-# Subject: CN=UCA Extended Validation Root O=UniTrust
-# Label: "UCA Extended Validation Root"
-# Serial: 106100277556486529736699587978573607008
-# MD5 Fingerprint: a1:f3:5f:43:c6:34:9b:da:bf:8c:7e:05:53:ad:96:e2
-# SHA1 Fingerprint: a3:a1:b0:6f:24:61:23:4a:e3:36:a5:c2:37:fc:a6:ff:dd:f0:d7:3a
-# SHA256 Fingerprint: d4:3a:f9:b3:54:73:75:5c:96:84:fc:06:d7:d8:cb:70:ee:5c:28:e7:73:fb:29:4e:b4:1e:e7:17:22:92:4d:24
------BEGIN CERTIFICATE-----
-MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBH
-MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBF
-eHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMx
-MDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNV
-BAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIiMA0GCSqGSIb3DQEB
-AQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrsiWog
-D4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvS
-sPGP2KxFRv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aop
-O2z6+I9tTcg1367r3CTueUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dk
-sHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR59mzLC52LqGj3n5qiAno8geK+LLNEOfi
-c0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH0mK1lTnj8/FtDw5lhIpj
-VMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KRel7sFsLz
-KuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/
-TuDvB0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41G
-sx2VYVdWf6/wFlthWG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs
-1+lvK9JKBZP8nm9rZ/+I8U6laUpSNwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQD
-fwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS3H5aBZ8eNJr34RQwDwYDVR0T
-AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBADaN
-l8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR
-ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQ
-VBcZEhrxH9cMaVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5
-c6sq1WnIeJEmMX3ixzDx/BR4dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp
-4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb+7lsq+KePRXBOy5nAliRn+/4Qh8s
-t2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOWF3sGPjLtx7dCvHaj
-2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwiGpWO
-vpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2C
-xR9GUeOcGMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmx
-cmtpzyKEC2IPrNkZAJSidjzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbM
-fjKaiJUINlK73nZfdklJrX+9ZSCyycErdhh2n1ax
------END CERTIFICATE-----
-
-# Issuer: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036
-# Subject: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036
-# Label: "Certigna Root CA"
-# Serial: 269714418870597844693661054334862075617
-# MD5 Fingerprint: 0e:5c:30:62:27:eb:5b:bc:d7:ae:62:ba:e9:d5:df:77
-# SHA1 Fingerprint: 2d:0d:52:14:ff:9e:ad:99:24:01:74:20:47:6e:6c:85:27:27:f5:43
-# SHA256 Fingerprint: d4:8d:3d:23:ee:db:50:a4:59:e5:51:97:60:1c:27:77:4b:9d:7b:18:c9:4d:5a:05:95:11:a1:02:50:b9:31:68
------BEGIN CERTIFICATE-----
-MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAw
-WjELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAw
-MiA0ODE0NjMwODEwMDAzNjEZMBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0x
-MzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjdaMFoxCzAJBgNVBAYTAkZSMRIwEAYD
-VQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYzMDgxMDAwMzYxGTAX
-BgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
-ggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sO
-ty3tRQgXstmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9M
-CiBtnyN6tMbaLOQdLNyzKNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPu
-I9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8JXrJhFwLrN1CTivngqIkicuQstDuI7pm
-TLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16XdG+RCYyKfHx9WzMfgIh
-C59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq4NYKpkDf
-ePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3Yz
-IoejwpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWT
-Co/1VTp2lc5ZmIoJlXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1k
-JWumIWmbat10TWuXekG9qxf5kBdIjzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5
-hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp//TBt2dzhauH8XwIDAQABo4IB
-GjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE
-FBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of
-1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczov
-L3d3d3cuY2VydGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilo
-dHRwOi8vY3JsLmNlcnRpZ25hLmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYr
-aHR0cDovL2NybC5kaGlteW90aXMuY29tL2NlcnRpZ25hcm9vdGNhLmNybDANBgkq
-hkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOItOoldaDgvUSILSo3L
-6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxPTGRG
-HVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH6
-0BGM+RFq7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncB
-lA2c5uk5jR+mUYyZDDl34bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdi
-o2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1
-gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS6Cvu5zHbugRqh5jnxV/v
-faci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaYtlu3zM63
-Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayh
-jWZSaX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw
-3kAP+HwV96LOPNdeE4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0=
------END CERTIFICATE-----
-
-# Issuer: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI
-# Subject: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI
-# Label: "emSign Root CA - G1"
-# Serial: 235931866688319308814040
-# MD5 Fingerprint: 9c:42:84:57:dd:cb:0b:a7:2e:95:ad:b6:f3:da:bc:ac
-# SHA1 Fingerprint: 8a:c7:ad:8f:73:ac:4e:c1:b5:75:4d:a5:40:f4:fc:cf:7c:b5:8e:8c
-# SHA256 Fingerprint: 40:f6:af:03:46:a9:9a:a1:cd:1d:55:5a:4e:9c:ce:62:c7:f9:63:46:03:ee:40:66:15:83:3d:c8:c8:d0:03:67
------BEGIN CERTIFICATE-----
-MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYD
-VQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBU
-ZWNobm9sb2dpZXMgTGltaXRlZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBH
-MTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgxODMwMDBaMGcxCzAJBgNVBAYTAklO
-MRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVkaHJhIFRlY2hub2xv
-Z2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIBIjAN
-BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQz
-f2N4aLTNLnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO
-8oG0x5ZOrRkVUkr+PHB1cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aq
-d7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHWDV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhM
-tTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ6DqS0hdW5TUaQBw+jSzt
-Od9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrHhQIDAQAB
-o0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQD
-AgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31x
-PaOfG1vR2vjTnGs2vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjM
-wiI/aTvFthUvozXGaCocV685743QNcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6d
-GNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q+Mri/Tm3R7nrft8EI6/6nAYH
-6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeihU80Bv2noWgby
-RQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx
-iN66zB+Afko=
------END CERTIFICATE-----
-
-# Issuer: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI
-# Subject: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI
-# Label: "emSign ECC Root CA - G3"
-# Serial: 287880440101571086945156
-# MD5 Fingerprint: ce:0b:72:d1:9f:88:8e:d0:50:03:e8:e3:b8:8b:67:40
-# SHA1 Fingerprint: 30:43:fa:4f:f2:57:dc:a0:c3:80:ee:2e:58:ea:78:b2:3f:e6:bb:c1
-# SHA256 Fingerprint: 86:a1:ec:ba:08:9c:4a:8d:3b:be:27:34:c6:12:ba:34:1d:81:3e:04:3c:f9:e8:a8:62:cd:5c:57:a3:6b:be:6b
------BEGIN CERTIFICATE-----
-MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQG
-EwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNo
-bm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g
-RzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4MTgzMDAwWjBrMQswCQYDVQQGEwJJ
-TjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9s
-b2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMw
-djAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0
-WXTsuwYc58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xyS
-fvalY8L1X44uT6EYGQIrMgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuB
-zhccLikenEhjQjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggq
-hkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+DCBeQyh+KTOgNG3qxrdWB
-CUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7jHvrZQnD
-+JbNR6iC8hZVdyR+EhCVBCyj
------END CERTIFICATE-----
-
-# Issuer: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI
-# Subject: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI
-# Label: "emSign Root CA - C1"
-# Serial: 825510296613316004955058
-# MD5 Fingerprint: d8:e3:5d:01:21:fa:78:5a:b0:df:ba:d2:ee:2a:5f:68
-# SHA1 Fingerprint: e7:2e:f1:df:fc:b2:09:28:cf:5d:d4:d5:67:37:b1:51:cb:86:4f:01
-# SHA256 Fingerprint: 12:56:09:aa:30:1d:a0:a2:49:b9:7a:82:39:cb:6a:34:21:6f:44:dc:ac:9f:39:54:b1:42:92:f2:e8:c8:60:8f
------BEGIN CERTIFICATE-----
-MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkG
-A1UEBhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEg
-SW5jMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAw
-MFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln
-biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNpZ24gUm9v
-dCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+upufGZ
-BczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZ
-HdPIWoU/Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH
-3DspVpNqs8FqOp099cGXOFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvH
-GPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4VI5b2P/AgNBbeCsbEBEV5f6f9vtKppa+c
-xSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleoomslMuoaJuvimUnzYnu3Yy1
-aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+XJGFehiq
-TbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL
-BQADggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87
-/kOXSTKZEhVb3xEp/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4
-kqNPEjE2NuLe/gDEo2APJ62gsIq1NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrG
-YQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9wC68AivTxEDkigcxHpvOJpkT
-+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQBmIMMMAVSKeo
-WXzhriKi4gp6D/piq1JM4fHfyr6DDUI=
------END CERTIFICATE-----
-
-# Issuer: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI
-# Subject: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI
-# Label: "emSign ECC Root CA - C3"
-# Serial: 582948710642506000014504
-# MD5 Fingerprint: 3e:53:b3:a3:81:ee:d7:10:f8:d3:b0:1d:17:92:f5:d5
-# SHA1 Fingerprint: b6:af:43:c2:9b:81:53:7d:f6:ef:6b:c3:1f:1f:60:15:0c:ee:48:66
-# SHA256 Fingerprint: bc:4d:80:9b:15:18:9d:78:db:3e:1d:8c:f4:f9:72:6a:79:5d:a1:64:3c:a5:f1:35:8e:1d:db:0e:dc:0d:7e:b3
------BEGIN CERTIFICATE-----
-MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQG
-EwJVUzETMBEGA1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMx
-IDAeBgNVBAMTF2VtU2lnbiBFQ0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAw
-MFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln
-biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQDExdlbVNpZ24gRUND
-IFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd6bci
-MK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4Ojavti
-sIGJAnB9SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0O
-BBYEFPtaSNCAIEDyqOkAB2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB
-Af8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQC02C8Cif22TGK6Q04ThHK1rt0c
-3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwUZOR8loMRnLDRWmFLpg9J
-0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ==
------END CERTIFICATE-----
-
-# Issuer: CN=Hongkong Post Root CA 3 O=Hongkong Post
-# Subject: CN=Hongkong Post Root CA 3 O=Hongkong Post
-# Label: "Hongkong Post Root CA 3"
-# Serial: 46170865288971385588281144162979347873371282084
-# MD5 Fingerprint: 11:fc:9f:bd:73:30:02:8a:fd:3f:f3:58:b9:cb:20:f0
-# SHA1 Fingerprint: 58:a2:d0:ec:20:52:81:5b:c1:f3:f8:64:02:24:4e:c2:8e:02:4b:02
-# SHA256 Fingerprint: 5a:2f:c0:3f:0c:83:b0:90:bb:fa:40:60:4b:09:88:44:6c:76:36:18:3d:f9:84:6e:17:10:1a:44:7f:b8:ef:d6
------BEGIN CERTIFICATE-----
-MIIFzzCCA7egAwIBAgIUCBZfikyl7ADJk0DfxMauI7gcWqQwDQYJKoZIhvcNAQEL
-BQAwbzELMAkGA1UEBhMCSEsxEjAQBgNVBAgTCUhvbmcgS29uZzESMBAGA1UEBxMJ
-SG9uZyBLb25nMRYwFAYDVQQKEw1Ib25na29uZyBQb3N0MSAwHgYDVQQDExdIb25n
-a29uZyBQb3N0IFJvb3QgQ0EgMzAeFw0xNzA2MDMwMjI5NDZaFw00MjA2MDMwMjI5
-NDZaMG8xCzAJBgNVBAYTAkhLMRIwEAYDVQQIEwlIb25nIEtvbmcxEjAQBgNVBAcT
-CUhvbmcgS29uZzEWMBQGA1UEChMNSG9uZ2tvbmcgUG9zdDEgMB4GA1UEAxMXSG9u
-Z2tvbmcgUG9zdCBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
-AoICAQCziNfqzg8gTr7m1gNt7ln8wlffKWihgw4+aMdoWJwcYEuJQwy51BWy7sFO
-dem1p+/l6TWZ5Mwc50tfjTMwIDNT2aa71T4Tjukfh0mtUC1Qyhi+AViiE3CWu4mI
-VoBc+L0sPOFMV4i707mV78vH9toxdCim5lSJ9UExyuUmGs2C4HDaOym71QP1mbpV
-9WTRYA6ziUm4ii8F0oRFKHyPaFASePwLtVPLwpgchKOesL4jpNrcyCse2m5FHomY
-2vkALgbpDDtw1VAliJnLzXNg99X/NWfFobxeq81KuEXryGgeDQ0URhLj0mRiikKY
-vLTGCAj4/ahMZJx2Ab0vqWwzD9g/KLg8aQFChn5pwckGyuV6RmXpwtZQQS4/t+Tt
-bNe/JgERohYpSms0BpDsE9K2+2p20jzt8NYt3eEV7KObLyzJPivkaTv/ciWxNoZb
-x39ri1UbSsUgYT2uy1DhCDq+sI9jQVMwCFk8mB13umOResoQUGC/8Ne8lYePl8X+
-l2oBlKN8W4UdKjk60FSh0Tlxnf0h+bV78OLgAo9uliQlLKAeLKjEiafv7ZkGL7YK
-TE/bosw3Gq9HhS2KX8Q0NEwA/RiTZxPRN+ZItIsGxVd7GYYKecsAyVKvQv83j+Gj
-Hno9UKtjBucVtT+2RTeUN7F+8kjDf8V1/peNRY8apxpyKBpADwIDAQABo2MwYTAP
-BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQXnc0e
-i9Y5K3DTXNSguB+wAPzFYTAdBgNVHQ4EFgQUF53NHovWOStw01zUoLgfsAD8xWEw
-DQYJKoZIhvcNAQELBQADggIBAFbVe27mIgHSQpsY1Q7XZiNc4/6gx5LS6ZStS6LG
-7BJ8dNVI0lkUmcDrudHr9EgwW62nV3OZqdPlt9EuWSRY3GguLmLYauRwCy0gUCCk
-MpXRAJi70/33MvJJrsZ64Ee+bs7Lo3I6LWldy8joRTnU+kLBEUx3XZL7av9YROXr
-gZ6voJmtvqkBZss4HTzfQx/0TW60uhdG/H39h4F5ag0zD/ov+BS5gLNdTaqX4fnk
-GMX41TiMJjz98iji7lpJiCzfeT2OnpA8vUFKOt1b9pq0zj8lMH8yfaIDlNDceqFS
-3m6TjRgm/VWsvY+b0s+v54Ysyx8Jb6NvqYTUc79NoXQbTiNg8swOqn+knEwlqLJm
-Ozj/2ZQw9nKEvmhVEA/GcywWaZMH/rFF7buiVWqw2rVKAiUnhde3t4ZEFolsgCs+
-l6mc1X5VTMbeRRAc6uk7nwNT7u56AQIWeNTowr5GdogTPyK7SBIdUgC0An4hGh6c
-JfTzPV4e0hz5sy229zdcxsshTrD3mUcYhcErulWuBurQB7Lcq9CClnXO0lD+mefP
-L5/ndtFhKvshuzHQqp9HpLIiyhY6UFfEW0NnxWViA0kB60PZ2Pierc+xYw5F9KBa
-LJstxabArahH9CdMOA0uG0k7UvToiIMrVCjU8jVStDKDYmlkDJGcn5fqdBb9HxEG
-mpv0
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFZTCCA02gAwIBAgIKUlD06gAAAAAAGDANBgkqhkiG9w0BAQ0FADAfMR0wGwYD
-VQQDExRZYW5kZXhJbnRlcm5hbFJvb3RDQTAeFw0xODA2MjgxMTE0NTdaFw0zMjA2
-MjgxMTI0NTdaMFsxEjAQBgoJkiaJk/IsZAEZFgJydTEWMBQGCgmSJomT8ixkARkW
-BnlhbmRleDESMBAGCgmSJomT8ixkARkWAmxkMRkwFwYDVQQDExBZYW5kZXhJbnRl
-cm5hbENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy6Sab1PCbISk
-GSAUpr6JJKLXlf4O+cBhjALfQn2QpPL/cDjZ2+MPXuAUgE8KT+/mbAGA2rJID0KY
-RjDSkByxnhoX8jwWsmPYXoAmOMPkgKRG9/ZefnMrK4oVhGgLmxnpbEkNbGh88cJ1
-OVzgD5LVHSpDqm7iEuoUPOJCWXQ51+rZ0Lw9zBEU8v3yXXI345iWpLj92pOQDH0G
-Tqr7BnQywxcgb5BYdywayacIT7UTJZk7832m5k7Oa3qMIKKXHsx26rNVUVBfpzph
-OFvqkLetOKHk7827NDKr3I3OFXzQk4gy6tagv8PZNp+XGOBWfYkbLfI4xbTnjHIW
-n5q1gfKPOQIDAQABo4IBZTCCAWEwEAYJKwYBBAGCNxUBBAMCAQIwIwYJKwYBBAGC
-NxUCBBYEFNgaef9LcdQKs6qfsfiuWF5p/yqRMB0GA1UdDgQWBBSP3TKDCRNT3ZEa
-Zumz1DzFtPJnSDBZBgNVHSAEUjBQME4GBFUdIAAwRjBEBggrBgEFBQcCARY4aHR0
-cDovL2NybHMueWFuZGV4LnJ1L2Nwcy9ZYW5kZXhJbnRlcm5hbENBL3BvbGljaWVz
-Lmh0bWwwGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGGMA8G
-A1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUq7nF/6Hv5lMdMzkihNF21DdOLWow
-VAYDVR0fBE0wSzBJoEegRYZDaHR0cDovL2NybHMueWFuZGV4LnJ1L1lhbmRleElu
-dGVybmFsUm9vdENBL1lhbmRleEludGVybmFsUm9vdENBLmNybDANBgkqhkiG9w0B
-AQ0FAAOCAgEAQnOiyykjwtSuCBV6rSiM8Q1rQIcfyqn1JBxSGeBMABc64loWSPaQ
-DtYPIW5rwNX7TQ94bjyYgCxhwHqUED/fcBOmXCQ2iBsdy5LOcNEZaC2kBHQuZ7dL
-0fSvpE98a41y9yY6CJGFXg8E/4GrQwgQEqT5Qbe9GHPadpRu+ptVvI6uLZG3ks2o
-oodjOm5C0SIo1pY4OtPAYE/AzTaYkTFbAqYcPfEfXHEOigBJBeXnQs7cANxX/RaF
-PnHEjZbGY57EtBP6p5ckndkfEmqp3PLXbsQteNOVpsUw5eVqEzinSisBmLc28nnr
-5QEojRontAaZd7ZzB5zaGkVuE+0laUUWSNBhfGE1R3LrTJEK9L7FEsBBprOxIWww
-CvLmAfglouwuNRc2TjRdfnZaEfPLD7NYIF4ahXPAMcfTii23Tlr2uB7LetNykSlX
-Z9S5/yf61VFEKnxuipFPNgtKqPcFgFUxlEb+wOeOfYZ7ex8VlpMBWbadj3Go025b
-KZUwKwHDQvgJ5pz9g3t+t5Xieu2pwyddWGu+1SItRohRhlyTiep7oW6yTps7Qt0e
-8pdLuLG7ZF19h1Pxi+dVbeaeNcsGEAOdRuCk+RTZHNe+J4yC8tNJOepnfYDul6SB
-RjFWthiFK45+TZRHAcsG9JuV8JNvgoKaL75v/GUsKaeJ3Cps3rBStfc=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFGTCCAwGgAwIBAgIQJMM7ZIy2SYxCBgK7WcFwnjANBgkqhkiG9w0BAQ0FADAf
-MR0wGwYDVQQDExRZYW5kZXhJbnRlcm5hbFJvb3RDQTAeFw0xMzAyMTExMzQxNDNa
-Fw0zMzAyMTExMzUxNDJaMB8xHTAbBgNVBAMTFFlhbmRleEludGVybmFsUm9vdENB
-MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAgb4xoQjBQ7oEFk8EHVGy
-1pDEmPWw0Wgw5nX9RM7LL2xQWyUuEq+Lf9Dgh+O725aZ9+SO2oEs47DHHt81/fne
-5N6xOftRrCpy8hGtUR/A3bvjnQgjs+zdXvcO9cTuuzzPTFSts/iZATZsAruiepMx
-SGj9S1fGwvYws/yiXWNoNBz4Tu1Tlp0g+5fp/ADjnxc6DqNk6w01mJRDbx+6rlBO
-aIH2tQmJXDVoFdrhmBK9qOfjxWlIYGy83TnrvdXwi5mKTMtpEREMgyNLX75UjpvO
-NkZgBvEXPQq+g91wBGsWIE2sYlguXiBniQgAJOyRuSdTxcJoG8tZkLDPRi5RouWY
-gxXr13edn1TRDGco2hkdtSUBlajBMSvAq+H0hkslzWD/R+BXkn9dh0/DFnxVt4XU
-5JbFyd/sKV/rF4Vygfw9ssh1ZIWdqkfZ2QXOZ2gH4AEeoN/9vEfUPwqPVzL0XEZK
-r4s2WjU9mE5tHrVsQOZ80wnvYHYi2JHbl0hr5ghs4RIyJwx6LEEnj2tzMFec4f7o
-dQeSsZpgRJmpvpAfRTxhIRjZBrKxnMytedAkUPguBQwjVCn7+EaKiJfpu42JG8Mm
-+/dHi+Q9Tc+0tX5pKOIpQMlMxMHw8MfPmUjC3AAd9lsmCtuybYoeN2IRdbzzchJ8
-l1ZuoI3gH7pcIeElfVSqSBkCAwEAAaNRME8wCwYDVR0PBAQDAgGGMA8GA1UdEwEB
-/wQFMAMBAf8wHQYDVR0OBBYEFKu5xf+h7+ZTHTM5IoTRdtQ3Ti1qMBAGCSsGAQQB
-gjcVAQQDAgEAMA0GCSqGSIb3DQEBDQUAA4ICAQAVpyJ1qLjqRLC34F1UXkC3vxpO
-nV6WgzpzA+DUNog4Y6RhTnh0Bsir+I+FTl0zFCm7JpT/3NP9VjfEitMkHehmHhQK
-c7cIBZSF62K477OTvLz+9ku2O/bGTtYv9fAvR4BmzFfyPDoAKOjJSghD1p/7El+1
-eSjvcUBzLnBUtxO/iYXRNo7B3+1qo4F5Hz7rPRLI0UWW/0UAfVCO2fFtyF6C1iEY
-/q0Ldbf3YIaMkf2WgGhnX9yH/8OiIij2r0LVNHS811apyycjep8y/NkG4q1Z9jEi
-VEX3P6NEL8dWtXQlvlNGMcfDT3lmB+tS32CPEUwce/Ble646rukbERRwFfxXojpf
-C6ium+LtJc7qnK6ygnYF4D6mz4H+3WaxJd1S1hGQxOb/3WVw63tZFnN62F6/nc5g
-6T44Yb7ND6y3nVcygLpbQsws6HsjX65CoSjrrPn0YhKxNBscF7M7tLTW/5LK9uhk
-yjRCkJ0YagpeLxfV1l1ZJZaTPZvY9+ylHnWHhzlq0FzcrooSSsp4i44DB2K7O2ID
-87leymZkKUY6PMDa4GkDJx0dG4UXDhRETMf+NkYgtLJ+UIzMNskwVDcxO4kVL+Hi
-Pj78bnC5yCw8P5YylR45LdxLzLO68unoXOyFz1etGXzszw8lJI9LNubYxk77mK8H
-LpuQKbSbIERsmR+QqQ==
------END CERTIFICATE-----
-"""
-
-
-def load_default_pem():
- global data
-
- if six.PY3:
- return data.encode("utf-8")
- return data
diff --git a/contrib/python/ydb/py2/ydb/driver.py b/contrib/python/ydb/py2/ydb/driver.py
deleted file mode 100644
index 9b3fa99cfa..0000000000
--- a/contrib/python/ydb/py2/ydb/driver.py
+++ /dev/null
@@ -1,242 +0,0 @@
-# -*- coding: utf-8 -*-
-from . import credentials as credentials_impl, table, scheme, pool
-from . import tracing
-import six
-import os
-import grpc
-from . import _utilities
-
-if six.PY2:
- Any = None
-else:
- from typing import Any # noqa
-
-
-class RPCCompression:
- """Indicates the compression method to be used for an RPC."""
-
- NoCompression = grpc.Compression.NoCompression
- Deflate = grpc.Compression.Deflate
- Gzip = grpc.Compression.Gzip
-
-
-def default_credentials(credentials=None, tracer=None):
- tracer = tracer if tracer is not None else tracing.Tracer(None)
- with tracer.trace("Driver.default_credentials") as ctx:
- if credentials is not None:
- ctx.trace({"credentials.prepared": True})
- return credentials
-
- service_account_key_file = os.getenv("YDB_SERVICE_ACCOUNT_KEY_FILE_CREDENTIALS")
- if service_account_key_file is not None:
- ctx.trace({"credentials.service_account_key_file": True})
- import ydb.iam
-
- return ydb.iam.ServiceAccountCredentials.from_file(service_account_key_file)
-
- anonymous_credetials = os.getenv("YDB_ANONYMOUS_CREDENTIALS", "0") == "1"
- if anonymous_credetials:
- ctx.trace({"credentials.anonymous": True})
- return credentials_impl.AnonymousCredentials()
-
- metadata_credentials = os.getenv("YDB_METADATA_CREDENTIALS", "0") == "1"
- if metadata_credentials:
- ctx.trace({"credentials.metadata": True})
- import ydb.iam
-
- return ydb.iam.MetadataUrlCredentials(tracer=tracer)
-
- access_token = os.getenv("YDB_ACCESS_TOKEN_CREDENTIALS")
- if access_token is not None:
- ctx.trace({"credentials.access_token": True})
- return credentials_impl.AuthTokenCredentials(access_token)
-
- import ydb.iam
-
- return ydb.iam.MetadataUrlCredentials(tracer=tracer)
-
-
-class DriverConfig(object):
- __slots__ = (
- "endpoint",
- "database",
- "ca_cert",
- "channel_options",
- "credentials",
- "use_all_nodes",
- "root_certificates",
- "certificate_chain",
- "private_key",
- "grpc_keep_alive_timeout",
- "secure_channel",
- "table_client_settings",
- "endpoints",
- "primary_user_agent",
- "tracer",
- "grpc_lb_policy_name",
- "discovery_request_timeout",
- "compression",
- )
-
- def __init__(
- self,
- endpoint,
- database=None,
- ca_cert=None,
- auth_token=None,
- channel_options=None,
- credentials=None,
- use_all_nodes=False,
- root_certificates=None,
- certificate_chain=None,
- private_key=None,
- grpc_keep_alive_timeout=None,
- table_client_settings=None,
- endpoints=None,
- primary_user_agent="python-library",
- tracer=None,
- grpc_lb_policy_name="round_robin",
- discovery_request_timeout=10,
- compression=None,
- ):
- """
- A driver config to initialize a driver instance
-
- :param endpoint: A endpoint specified in pattern host:port to be used for initial channel initialization and for YDB endpoint discovery mechanism
- :param database: A name of the database
- :param ca_cert: A CA certificate when SSL should be used
- :param auth_token: A authentication token
- :param credentials: An instance of AbstractCredentials
- :param use_all_nodes: A balancing policy that forces to use all available nodes.
- :param root_certificates: The PEM-encoded root certificates as a byte string.
- :param private_key: The PEM-encoded private key as a byte string, or None if no\
- private key should be used.
- :param certificate_chain: The PEM-encoded certificate chain as a byte string\
- to use or or None if no certificate chain should be used.
- :param grpc_keep_alive_timeout: GRpc KeepAlive timeout, ms
- :param ydb.Tracer tracer: ydb.Tracer instance to trace requests in driver.\
- If tracing aio ScopeManager must be ContextVarsScopeManager
- :param grpc_lb_policy_name: A load balancing policy to be used for discovery channel construction. Default value is `round_round`
- :param discovery_request_timeout: A default timeout to complete the discovery. The default value is 10 seconds.
-
- """
- self.endpoint = endpoint
- self.database = database
- self.ca_cert = ca_cert
- self.channel_options = channel_options
- self.secure_channel = _utilities.is_secure_protocol(endpoint)
- self.endpoint = _utilities.wrap_endpoint(self.endpoint)
- self.endpoints = []
- if endpoints is not None:
- self.endpoints = [_utilities.wrap_endpoint(endp) for endp in endpoints]
- if auth_token is not None:
- credentials = credentials_impl.AuthTokenCredentials(auth_token)
- self.credentials = credentials
- self.use_all_nodes = use_all_nodes
- self.root_certificates = root_certificates
- self.certificate_chain = certificate_chain
- self.private_key = private_key
- self.grpc_keep_alive_timeout = grpc_keep_alive_timeout
- self.table_client_settings = table_client_settings
- self.primary_user_agent = primary_user_agent
- self.tracer = tracer if tracer is not None else tracing.Tracer(None)
- self.grpc_lb_policy_name = grpc_lb_policy_name
- self.discovery_request_timeout = discovery_request_timeout
- self.compression = compression
-
- def set_database(self, database):
- self.database = database
- return self
-
- @classmethod
- def default_from_endpoint_and_database(
- cls, endpoint, database, root_certificates=None, credentials=None, **kwargs
- ):
- return cls(
- endpoint,
- database,
- credentials=default_credentials(credentials),
- root_certificates=root_certificates,
- **kwargs
- )
-
- @classmethod
- def default_from_connection_string(
- cls, connection_string, root_certificates=None, credentials=None, **kwargs
- ):
- endpoint, database = _utilities.parse_connection_string(connection_string)
- return cls(
- endpoint,
- database,
- credentials=default_credentials(credentials),
- root_certificates=root_certificates,
- **kwargs
- )
-
- def set_grpc_keep_alive_timeout(self, timeout):
- self.grpc_keep_alive_timeout = timeout
- return self
-
-
-ConnectionParams = DriverConfig
-
-
-def get_config(
- driver_config=None,
- connection_string=None,
- endpoint=None,
- database=None,
- root_certificates=None,
- credentials=None,
- config_class=DriverConfig,
- **kwargs
-):
- if driver_config is None:
- if connection_string is not None:
- driver_config = config_class.default_from_connection_string(
- connection_string, root_certificates, credentials, **kwargs
- )
- else:
- driver_config = config_class.default_from_endpoint_and_database(
- endpoint, database, root_certificates, credentials, **kwargs
- )
- return driver_config
- return driver_config
-
-
-class Driver(pool.ConnectionPool):
- __slots__ = ("scheme_client", "table_client")
-
- def __init__(
- self,
- driver_config=None,
- connection_string=None,
- endpoint=None,
- database=None,
- root_certificates=None,
- credentials=None,
- **kwargs
- ):
- """
- Constructs a driver instance to be used in table and scheme clients.
- It encapsulates endpoints discovery mechanism and provides ability to execute RPCs
- on discovered endpoints
-
- :param driver_config: A driver config
- :param connection_string: A string in the following format: <protocol>://<hostame>:<port>/?database=/path/to/the/database
- :param endpoint: An endpoint specified in the following format: <protocol>://<hostame>:<port>
- :param database: A database path
- :param credentials: A credentials. If not specifed credentials constructed by default.
- """
- driver_config = get_config(
- driver_config,
- connection_string,
- endpoint,
- database,
- root_certificates,
- credentials,
- )
-
- super(Driver, self).__init__(driver_config)
- self.scheme_client = scheme.SchemeClient(self)
- self.table_client = table.TableClient(self, driver_config.table_client_settings)
diff --git a/contrib/python/ydb/py2/ydb/export.py b/contrib/python/ydb/py2/ydb/export.py
deleted file mode 100644
index aac31315ca..0000000000
--- a/contrib/python/ydb/py2/ydb/export.py
+++ /dev/null
@@ -1,280 +0,0 @@
-import enum
-
-from . import _apis
-
-from . import settings_impl as s_impl
-
-try:
- from ydb.public.api.protos import ydb_export_pb2
- from ydb.public.api.grpc import ydb_export_v1_pb2_grpc
-except ImportError:
- from contrib.ydb.public.api.protos import ydb_export_pb2
- from contrib.ydb.public.api.grpc import ydb_export_v1_pb2_grpc
-
-from . import operation
-
-_ExportToYt = "ExportToYt"
-_ExportToS3 = "ExportToS3"
-_progresses = {}
-
-
-@enum.unique
-class ExportProgress(enum.IntEnum):
- UNSPECIFIED = 0
- PREPARING = 1
- TRANSFER_DATA = 2
- DONE = 3
- CANCELLATION = 4
- CANCELLED = 5
-
-
-def _initialize_progresses():
- for key, value in ydb_export_pb2.ExportProgress.Progress.items():
- _progresses[value] = getattr(ExportProgress, key[len("PROGRESS_") :])
-
-
-_initialize_progresses()
-
-
-class ExportToYTOperation(operation.Operation):
- def __init__(self, rpc_state, response, driver):
- super(ExportToYTOperation, self).__init__(rpc_state, response, driver)
- metadata = ydb_export_pb2.ExportToYtMetadata()
- response.operation.metadata.Unpack(metadata)
- self.progress = _progresses.get(metadata.progress)
- self.items_progress = metadata.items_progress
-
- def __str__(self):
- return "ExportToYTOperation<id: %s, progress: %s>" % (
- self.id,
- self.progress.name,
- )
-
- def __repr__(self):
- return self.__str__()
-
-
-class ExportToS3Operation(operation.Operation):
- def __init__(self, rpc_state, response, driver):
- super(ExportToS3Operation, self).__init__(rpc_state, response, driver)
- metadata = ydb_export_pb2.ExportToS3Metadata()
- response.operation.metadata.Unpack(metadata)
- self.progress = _progresses.get(metadata.progress)
- self.items_progress = metadata.items_progress
-
- def __str__(self):
- return "ExportToS3Operation<id: %s, progress: %s>" % (
- self.id,
- self.progress.name,
- )
-
- def __repr__(self):
- return self.__str__()
-
-
-class ExportToYTSettings(s_impl.BaseRequestSettings):
- def __init__(self):
- super(ExportToYTSettings, self).__init__()
- self.items = []
- self.number_of_retries = 0
- self.token = None
- self.host = None
- self.port = None
- self.uid = None
-
- def with_port(self, port):
- self.port = port
- return self
-
- def with_host(self, host):
- self.host = host
- return self
-
- def with_uid(self, uid):
- self.uid = uid
- return self
-
- def with_token(self, token):
- self.token = token
- return self
-
- def with_item(self, item):
- """
- :param: A source & destination tuple to export.
- """
- self.items.append(item)
- return self
-
- def with_source_and_destination(self, source_path, destination_path):
- return self.with_item((source_path, destination_path))
-
- def with_number_of_retries(self, number_of_retries):
- self.number_of_retries = number_of_retries
- return self
-
- def with_items(self, *items):
- self.items.extend(items)
- return self
-
-
-class ExportToS3Settings(s_impl.BaseRequestSettings):
- def __init__(self):
- super(ExportToS3Settings, self).__init__()
- self.items = []
- self.bucket = None
- self.endpoint = None
- self.scheme = 2
- self.uid = None
- self.access_key = None
- self.secret_key = None
- self.number_of_retries = 0
- self.storage_class = None
- self.export_compression = None
-
- def with_scheme(self, scheme):
- self.scheme = scheme
- return self
-
- def with_storage_class(self, storage_class):
- self.storage_class = storage_class
- return self
-
- def with_export_compression(self, compression):
- self.export_compression = compression
- return self
-
- def with_bucket(self, bucket):
- self.bucket = bucket
- return self
-
- def with_endpoint(self, endpoint):
- self.endpoint = endpoint
- return self
-
- def with_access_key(self, access_key):
- self.access_key = access_key
- return self
-
- def with_uid(self, uid):
- self.uid = uid
- return self
-
- def with_secret_key(self, secret_key):
- self.secret_key = secret_key
- return self
-
- def with_number_of_retries(self, number_of_retries):
- self.number_of_retries = number_of_retries
- return self
-
- def with_source_and_destination(self, source_path, destination_prefix):
- return self.with_item((source_path, destination_prefix))
-
- def with_item(self, item):
- self.items.append(item)
- return self
-
- def with_items(self, *items):
- self.items.extend(items)
- return self
-
-
-def _export_to_yt_request_factory(settings):
- request = ydb_export_pb2.ExportToYtRequest(
- settings=ydb_export_pb2.ExportToYtSettings(
- host=settings.host, token=settings.token
- )
- )
-
- if settings.number_of_retries > 0:
- request.settings.number_of_retries = settings.number_of_retries
-
- if settings.port:
- request.settings.port = settings.port
-
- for source_path, destination_path in settings.items:
- request.settings.items.add(
- source_path=source_path, destination_path=destination_path
- )
-
- return request
-
-
-def _get_operation_request(operation_id):
- request = _apis.ydb_operation.GetOperationRequest(id=operation_id)
- return request
-
-
-def _export_to_s3_request_factory(settings):
- request = ydb_export_pb2.ExportToS3Request(
- settings=ydb_export_pb2.ExportToS3Settings(
- endpoint=settings.endpoint,
- bucket=settings.bucket,
- access_key=settings.access_key,
- secret_key=settings.secret_key,
- scheme=settings.scheme,
- storage_class=settings.storage_class,
- )
- )
-
- if settings.uid is not None:
- request.operation_params.labels["uid"] = settings.uid
-
- if settings.number_of_retries > 0:
- request.settings.number_of_retries = settings.number_of_retries
-
- if settings.export_compression is not None:
- request.settings.compression = settings.export_compression
-
- for source_path, destination_prefix in settings.items:
- request.settings.items.add(
- source_path=source_path,
- destination_prefix=destination_prefix,
- )
-
- return request
-
-
-class ExportClient(object):
- def __init__(self, driver):
- self._driver = driver
-
- def get_export_to_s3_operation(self, operation_id, settings=None):
- return self._driver(
- _get_operation_request(operation_id),
- _apis.OperationService.Stub,
- _apis.OperationService.GetOperation,
- ExportToS3Operation,
- settings,
- (self._driver,),
- )
-
- def export_to_s3(self, settings):
- return self._driver(
- _export_to_s3_request_factory(settings),
- ydb_export_v1_pb2_grpc.ExportServiceStub,
- _ExportToS3,
- ExportToS3Operation,
- settings,
- (self._driver,),
- )
-
- def export_to_yt(self, settings):
- return self._driver(
- _export_to_yt_request_factory(settings),
- ydb_export_v1_pb2_grpc.ExportServiceStub,
- _ExportToYt,
- ExportToYTOperation,
- settings,
- (self._driver,),
- )
-
- def async_export_to_yt(self, settings):
- return self._driver.future(
- _export_to_yt_request_factory(settings),
- ydb_export_v1_pb2_grpc.ExportServiceStub,
- _ExportToYt,
- ExportToYTOperation,
- settings,
- (self._driver,),
- )
diff --git a/contrib/python/ydb/py2/ydb/global_settings.py b/contrib/python/ydb/py2/ydb/global_settings.py
deleted file mode 100644
index 8a3ec9535e..0000000000
--- a/contrib/python/ydb/py2/ydb/global_settings.py
+++ /dev/null
@@ -1,16 +0,0 @@
-from . import convert
-from . import table
-
-
-def global_allow_truncated_result(enabled=True):
- """
- call global_allow_truncated_result(False) for more safe execution and compatible with future changes
- """
- convert._default_allow_truncated_result = enabled
-
-
-def global_allow_split_transactions(enabled):
- """
- call global_allow_truncated_result(False) for more safe execution and compatible with future changes
- """
- table._allow_split_transaction = enabled
diff --git a/contrib/python/ydb/py2/ydb/iam/__init__.py b/contrib/python/ydb/py2/ydb/iam/__init__.py
deleted file mode 100644
index 7167efe13e..0000000000
--- a/contrib/python/ydb/py2/ydb/iam/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# -*- coding: utf-8 -*-
-from .auth import ServiceAccountCredentials # noqa
-from .auth import MetadataUrlCredentials # noqa
diff --git a/contrib/python/ydb/py2/ydb/iam/auth.py b/contrib/python/ydb/py2/ydb/iam/auth.py
deleted file mode 100644
index 06b07e917e..0000000000
--- a/contrib/python/ydb/py2/ydb/iam/auth.py
+++ /dev/null
@@ -1,197 +0,0 @@
-# -*- coding: utf-8 -*-
-from ydb import credentials, tracing
-import grpc
-import time
-import abc
-import six
-from datetime import datetime
-import json
-import os
-
-try:
- from yandex.cloud.iam.v1 import iam_token_service_pb2_grpc
- from yandex.cloud.iam.v1 import iam_token_service_pb2
- import jwt
-except ImportError:
- jwt = None
- iam_token_service_pb2_grpc = None
- iam_token_service_pb2 = None
-
-try:
- import requests
-except ImportError:
- requests = None
-
-
-DEFAULT_METADATA_URL = (
- "http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/token"
-)
-
-
-def get_jwt(account_id, access_key_id, private_key, jwt_expiration_timeout):
- now = time.time()
- now_utc = datetime.utcfromtimestamp(now)
- exp_utc = datetime.utcfromtimestamp(now + jwt_expiration_timeout)
- return jwt.encode(
- key=private_key,
- algorithm="PS256",
- headers={"typ": "JWT", "alg": "PS256", "kid": access_key_id},
- payload={
- "iss": account_id,
- "aud": "https://iam.api.cloud.yandex.net/iam/v1/tokens",
- "iat": now_utc,
- "exp": exp_utc,
- },
- )
-
-
-@six.add_metaclass(abc.ABCMeta)
-class TokenServiceCredentials(credentials.AbstractExpiringTokenCredentials):
- def __init__(self, iam_endpoint=None, iam_channel_credentials=None, tracer=None):
- super(TokenServiceCredentials, self).__init__(tracer)
- assert (
- iam_token_service_pb2_grpc is not None
- ), "run pip install==ydb[yc] to use service account credentials"
- self._get_token_request_timeout = 10
- self._iam_token_service_pb2 = iam_token_service_pb2
- self._iam_token_service_pb2_grpc = iam_token_service_pb2_grpc
- self._iam_endpoint = (
- "iam.api.cloud.yandex.net:443" if iam_endpoint is None else iam_endpoint
- )
- self._iam_channel_credentials = (
- {} if iam_channel_credentials is None else iam_channel_credentials
- )
-
- def _channel_factory(self):
- return grpc.secure_channel(
- self._iam_endpoint,
- grpc.ssl_channel_credentials(**self._iam_channel_credentials),
- )
-
- @abc.abstractmethod
- def _get_token_request(self):
- pass
-
- @tracing.with_trace()
- def _make_token_request(self):
- with self._channel_factory() as channel:
- tracing.trace(self.tracer, {"iam_token.from_service": True})
- stub = self._iam_token_service_pb2_grpc.IamTokenServiceStub(channel)
- response = stub.Create(
- self._get_token_request(), timeout=self._get_token_request_timeout
- )
- expires_in = max(0, response.expires_at.seconds - int(time.time()))
- return {"access_token": response.iam_token, "expires_in": expires_in}
-
-
-@six.add_metaclass(abc.ABCMeta)
-class BaseJWTCredentials(object):
- def __init__(self, account_id, access_key_id, private_key):
- self._account_id = account_id
- self._jwt_expiration_timeout = 60.0 * 60
- self._token_expiration_timeout = 120
- self._access_key_id = access_key_id
- self._private_key = private_key
-
- def set_token_expiration_timeout(self, value):
- self._token_expiration_timeout = value
- return self
-
- @classmethod
- def from_file(cls, key_file, iam_endpoint=None, iam_channel_credentials=None):
- with open(os.path.expanduser(key_file), "r") as r:
- output = json.loads(r.read())
- account_id = output.get("service_account_id", None)
- if account_id is None:
- account_id = output.get("user_account_id", None)
- return cls(
- account_id,
- output["id"],
- output["private_key"],
- iam_endpoint=iam_endpoint,
- iam_channel_credentials=iam_channel_credentials,
- )
-
-
-class JWTIamCredentials(TokenServiceCredentials, BaseJWTCredentials):
- def __init__(
- self,
- account_id,
- access_key_id,
- private_key,
- iam_endpoint=None,
- iam_channel_credentials=None,
- ):
- TokenServiceCredentials.__init__(self, iam_endpoint, iam_channel_credentials)
- BaseJWTCredentials.__init__(self, account_id, access_key_id, private_key)
-
- def _get_token_request(self):
- return self._iam_token_service_pb2.CreateIamTokenRequest(
- jwt=get_jwt(
- self._account_id,
- self._access_key_id,
- self._private_key,
- self._jwt_expiration_timeout,
- )
- )
-
-
-class YandexPassportOAuthIamCredentials(TokenServiceCredentials):
- def __init__(
- self,
- yandex_passport_oauth_token,
- iam_endpoint=None,
- iam_channel_credentials=None,
- ):
- self._yandex_passport_oauth_token = yandex_passport_oauth_token
- super(YandexPassportOAuthIamCredentials, self).__init__(
- iam_endpoint, iam_channel_credentials
- )
-
- def _get_token_request(self):
- return iam_token_service_pb2.CreateIamTokenRequest(
- yandex_passport_oauth_token=self._yandex_passport_oauth_token
- )
-
-
-class MetadataUrlCredentials(credentials.AbstractExpiringTokenCredentials):
- def __init__(self, metadata_url=None, tracer=None):
- """
- :param metadata_url: Metadata url
- :param ydb.Tracer tracer: ydb tracer
- """
- super(MetadataUrlCredentials, self).__init__(tracer)
- assert (
- requests is not None
- ), "Install requests library to use metadata credentials provider"
- self.extra_error_message = "Check that metadata service configured properly since we failed to fetch it from metadata_url."
- self._metadata_url = (
- DEFAULT_METADATA_URL if metadata_url is None else metadata_url
- )
- self._tp.submit(self._refresh)
-
- @tracing.with_trace()
- def _make_token_request(self):
- response = requests.get(
- self._metadata_url, headers={"Metadata-Flavor": "Google"}, timeout=3
- )
- response.raise_for_status()
- return json.loads(response.text)
-
-
-class ServiceAccountCredentials(JWTIamCredentials):
- def __init__(
- self,
- service_account_id,
- access_key_id,
- private_key,
- iam_endpoint=None,
- iam_channel_credentials=None,
- ):
- super(ServiceAccountCredentials, self).__init__(
- service_account_id,
- access_key_id,
- private_key,
- iam_endpoint,
- iam_channel_credentials,
- )
diff --git a/contrib/python/ydb/py2/ydb/import_client.py b/contrib/python/ydb/py2/ydb/import_client.py
deleted file mode 100644
index 9d7d435137..0000000000
--- a/contrib/python/ydb/py2/ydb/import_client.py
+++ /dev/null
@@ -1,165 +0,0 @@
-import enum
-
-from . import _apis
-
-from . import settings_impl as s_impl
-
-try:
- from ydb.public.api.protos import ydb_import_pb2
- from ydb.public.api.grpc import ydb_import_v1_pb2_grpc
-except ImportError:
- from contrib.ydb.public.api.protos import ydb_import_pb2
- from contrib.ydb.public.api.grpc import ydb_import_v1_pb2_grpc
-
-
-from . import operation
-
-_ImportFromS3 = "ImportFromS3"
-_progresses = {}
-
-
-@enum.unique
-class ImportProgress(enum.IntEnum):
- UNSPECIFIED = 0
- PREPARING = 1
- TRANSFER_DATA = 2
- BUILD_INDEXES = 3
- DONE = 4
- CANCELLATION = 5
- CANCELLED = 6
-
-
-def _initialize_progresses():
- for key, value in ydb_import_pb2.ImportProgress.Progress.items():
- try:
- _progresses[value] = getattr(ImportProgress, key[len("PROGRESS_") :])
- except Exception:
- pass
-
-
-_initialize_progresses()
-
-
-class ImportFromS3Operation(operation.Operation):
- def __init__(self, rpc_state, response, driver):
- super(ImportFromS3Operation, self).__init__(rpc_state, response, driver)
- metadata = ydb_import_pb2.ImportFromS3Metadata()
- response.operation.metadata.Unpack(metadata)
- self.progress = _progresses.get(metadata.progress)
-
- def __str__(self):
- return "ImportFromS3Operation<id: %s, progress: %s>" % (
- self.id,
- self.progress.name,
- )
-
- def __repr__(self):
- return self.__str__()
-
-
-class ImportFromS3Settings(s_impl.BaseRequestSettings):
- def __init__(self):
- super(ImportFromS3Settings, self).__init__()
- self.items = []
- self.bucket = None
- self.endpoint = None
- self.scheme = 2
- self.uid = None
- self.access_key = None
- self.secret_key = None
- self.number_of_retries = 0
-
- def with_scheme(self, scheme):
- self.scheme = scheme
- return self
-
- def with_bucket(self, bucket):
- self.bucket = bucket
- return self
-
- def with_endpoint(self, endpoint):
- self.endpoint = endpoint
- return self
-
- def with_access_key(self, access_key):
- self.access_key = access_key
- return self
-
- def with_uid(self, uid):
- self.uid = uid
- return self
-
- def with_secret_key(self, secret_key):
- self.secret_key = secret_key
- return self
-
- def with_number_of_retries(self, number_of_retries):
- self.number_of_retries = number_of_retries
- return self
-
- def with_source_and_destination(self, source_path, destination_prefix):
- return self.with_item((source_path, destination_prefix))
-
- def with_item(self, item):
- self.items.append(item)
- return self
-
- def with_items(self, *items):
- self.items.extend(items)
- return self
-
-
-def _get_operation_request(operation_id):
- request = _apis.ydb_operation.GetOperationRequest(id=operation_id)
- return request
-
-
-def _import_from_s3_request_factory(settings):
- request = ydb_import_pb2.ImportFromS3Request(
- settings=ydb_import_pb2.ImportFromS3Settings(
- endpoint=settings.endpoint,
- bucket=settings.bucket,
- access_key=settings.access_key,
- secret_key=settings.secret_key,
- scheme=settings.scheme,
- )
- )
-
- if settings.uid is not None:
- request.operation_params.labels["uid"] = settings.uid
-
- if settings.number_of_retries > 0:
- request.settings.number_of_retries = settings.number_of_retries
-
- for source, destination in settings.items:
- request.settings.items.add(
- source_prefix=source,
- destination_path=destination,
- )
-
- return request
-
-
-class ImportClient(object):
- def __init__(self, driver):
- self._driver = driver
-
- def get_import_from_s3_operation(self, operation_id, settings=None):
- return self._driver(
- _get_operation_request(operation_id),
- _apis.OperationService.Stub,
- _apis.OperationService.GetOperation,
- ImportFromS3Operation,
- settings,
- (self._driver,),
- )
-
- def import_from_s3(self, settings):
- return self._driver(
- _import_from_s3_request_factory(settings),
- ydb_import_v1_pb2_grpc.ImportServiceStub,
- _ImportFromS3,
- ImportFromS3Operation,
- settings,
- (self._driver,),
- )
diff --git a/contrib/python/ydb/py2/ydb/interceptor.py b/contrib/python/ydb/py2/ydb/interceptor.py
deleted file mode 100644
index 5405177a8e..0000000000
--- a/contrib/python/ydb/py2/ydb/interceptor.py
+++ /dev/null
@@ -1,68 +0,0 @@
-# -*- coding: utf-8 -*-
-import grpc
-from concurrent import futures
-from grpc._cython import cygrpc
-from grpc._channel import _handle_event, _EMPTY_FLAGS
-
-
-def _event_handler(state, response_deserializer):
- def handle_event(event):
- with state.condition:
- callbacks = _handle_event(event, state, response_deserializer)
- state.condition.notify_all()
- done = not state.due
- for callback in callbacks:
- callback()
-
- if getattr(state, "on_event_handler_callback", None) is not None:
- state.on_event_handler_callback(state)
-
- return done and state.fork_epoch >= cygrpc.get_fork_epoch()
-
- return handle_event
-
-
-def on_event_callback(future, it, response_wrapper):
- def _callback(state):
- with state.condition:
- if state.response is not None:
- response = state.response
- state.response = None
- if not future.done():
- try:
- future.set_result(response_wrapper(response))
- except Exception as e:
- future.set_exception(e)
- elif cygrpc.OperationType.receive_message not in state.due:
- if state.code is grpc.StatusCode.OK:
- if not future.done():
- future.set_exception(StopIteration())
- elif state.code is not None:
- if not future.done():
- future.set_exception(it)
-
- return _callback
-
-
-def operate_async_stream_call(it, wrapper):
- future = futures.Future()
- callback = on_event_callback(future, it, wrapper)
-
- with it._state.condition:
- if it._state.code is None:
- it._state.on_event_handler_callback = callback
- operating = it._call.operate(
- (cygrpc.ReceiveMessageOperation(_EMPTY_FLAGS),),
- _event_handler(it._state, it._response_deserializer),
- )
- if operating:
- it._state.due.add(cygrpc.OperationType.receive_message)
- elif it._state.code is grpc.StatusCode.OK:
- future.set_exception(StopIteration())
- else:
- future.set_exception(it)
- return future
-
-
-def monkey_patch_event_handler():
- grpc._channel._event_handler = _event_handler
diff --git a/contrib/python/ydb/py2/ydb/issues.py b/contrib/python/ydb/py2/ydb/issues.py
deleted file mode 100644
index 611f15ecad..0000000000
--- a/contrib/python/ydb/py2/ydb/issues.py
+++ /dev/null
@@ -1,206 +0,0 @@
-# -*- coding: utf-8 -*-
-from google.protobuf import text_format
-import enum
-from six.moves import queue
-
-from . import _apis
-
-
-_TRANSPORT_STATUSES_FIRST = 401000
-_CLIENT_STATUSES_FIRST = 402000
-
-
-@enum.unique
-class StatusCode(enum.IntEnum):
- STATUS_CODE_UNSPECIFIED = _apis.StatusIds.STATUS_CODE_UNSPECIFIED
- SUCCESS = _apis.StatusIds.SUCCESS
- BAD_REQUEST = _apis.StatusIds.BAD_REQUEST
- UNAUTHORIZED = _apis.StatusIds.UNAUTHORIZED
- INTERNAL_ERROR = _apis.StatusIds.INTERNAL_ERROR
- ABORTED = _apis.StatusIds.ABORTED
- UNAVAILABLE = _apis.StatusIds.UNAVAILABLE
- OVERLOADED = _apis.StatusIds.OVERLOADED
- SCHEME_ERROR = _apis.StatusIds.SCHEME_ERROR
- GENERIC_ERROR = _apis.StatusIds.GENERIC_ERROR
- TIMEOUT = _apis.StatusIds.TIMEOUT
- BAD_SESSION = _apis.StatusIds.BAD_SESSION
- PRECONDITION_FAILED = _apis.StatusIds.PRECONDITION_FAILED
- ALREADY_EXISTS = _apis.StatusIds.ALREADY_EXISTS
- NOT_FOUND = _apis.StatusIds.NOT_FOUND
- SESSION_EXPIRED = _apis.StatusIds.SESSION_EXPIRED
- CANCELLED = _apis.StatusIds.CANCELLED
- UNDETERMINED = _apis.StatusIds.UNDETERMINED
- UNSUPPORTED = _apis.StatusIds.UNSUPPORTED
- SESSION_BUSY = _apis.StatusIds.SESSION_BUSY
- EXTERNAL_ERROR = _apis.StatusIds.EXTERNAL_ERROR
-
- CONNECTION_LOST = _TRANSPORT_STATUSES_FIRST + 10
- CONNECTION_FAILURE = _TRANSPORT_STATUSES_FIRST + 20
- DEADLINE_EXCEEDED = _TRANSPORT_STATUSES_FIRST + 30
- CLIENT_INTERNAL_ERROR = _TRANSPORT_STATUSES_FIRST + 40
- UNIMPLEMENTED = _TRANSPORT_STATUSES_FIRST + 50
-
- UNAUTHENTICATED = _CLIENT_STATUSES_FIRST + 30
- SESSION_POOL_EMPTY = _CLIENT_STATUSES_FIRST + 40
-
-
-class Error(Exception):
- status = None
-
- def __init__(self, message, issues=None):
- super(Error, self).__init__(message)
- self.issues = issues
- self.message = message
-
-
-class TruncatedResponseError(Error):
- status = None
-
-
-class ConnectionError(Error):
- status = None
-
-
-class ConnectionFailure(ConnectionError):
- status = StatusCode.CONNECTION_FAILURE
-
-
-class ConnectionLost(ConnectionError):
- status = StatusCode.CONNECTION_LOST
-
-
-class DeadlineExceed(ConnectionError):
- status = StatusCode.DEADLINE_EXCEEDED
-
-
-class Unimplemented(ConnectionError):
- status = StatusCode.UNIMPLEMENTED
-
-
-class Unauthenticated(Error):
- status = StatusCode.UNAUTHENTICATED
-
-
-class BadRequest(Error):
- status = StatusCode.BAD_REQUEST
-
-
-class Unauthorized(Error):
- status = StatusCode.UNAUTHORIZED
-
-
-class InternalError(Error):
- status = StatusCode.INTERNAL_ERROR
-
-
-class Aborted(Error):
- status = StatusCode.ABORTED
-
-
-class Unavailable(Error):
- status = StatusCode.UNAVAILABLE
-
-
-class Overloaded(Error):
- status = StatusCode.OVERLOADED
-
-
-class SchemeError(Error):
- status = StatusCode.SCHEME_ERROR
-
-
-class GenericError(Error):
- status = StatusCode.GENERIC_ERROR
-
-
-class BadSession(Error):
- status = StatusCode.BAD_SESSION
-
-
-class Timeout(Error):
- status = StatusCode.TIMEOUT
-
-
-class PreconditionFailed(Error):
- status = StatusCode.PRECONDITION_FAILED
-
-
-class NotFound(Error):
- status = StatusCode.NOT_FOUND
-
-
-class AlreadyExists(Error):
- status = StatusCode.ALREADY_EXISTS
-
-
-class SessionExpired(Error):
- status = StatusCode.SESSION_EXPIRED
-
-
-class Cancelled(Error):
- status = StatusCode.CANCELLED
-
-
-class Undetermined(Error):
- status = StatusCode.UNDETERMINED
-
-
-class Unsupported(Error):
- status = StatusCode.UNSUPPORTED
-
-
-class SessionBusy(Error):
- status = StatusCode.SESSION_BUSY
-
-
-class ExternalError(Error):
- status = StatusCode.EXTERNAL_ERROR
-
-
-class SessionPoolEmpty(Error, queue.Empty):
- status = StatusCode.SESSION_POOL_EMPTY
-
-
-def _format_issues(issues):
- if not issues:
- return ""
-
- return " ,".join(
- text_format.MessageToString(issue, as_utf8=False, as_one_line=True)
- for issue in issues
- )
-
-
-def _format_response(response):
- fmt_issues = _format_issues(response.issues)
- return "{0} (server_code: {1})".format(fmt_issues, response.status)
-
-
-_success_status_codes = {StatusCode.STATUS_CODE_UNSPECIFIED, StatusCode.SUCCESS}
-_server_side_error_map = {
- StatusCode.BAD_REQUEST: BadRequest,
- StatusCode.UNAUTHORIZED: Unauthorized,
- StatusCode.INTERNAL_ERROR: InternalError,
- StatusCode.ABORTED: Aborted,
- StatusCode.UNAVAILABLE: Unavailable,
- StatusCode.OVERLOADED: Overloaded,
- StatusCode.SCHEME_ERROR: SchemeError,
- StatusCode.GENERIC_ERROR: GenericError,
- StatusCode.TIMEOUT: Timeout,
- StatusCode.BAD_SESSION: BadSession,
- StatusCode.PRECONDITION_FAILED: PreconditionFailed,
- StatusCode.ALREADY_EXISTS: AlreadyExists,
- StatusCode.NOT_FOUND: NotFound,
- StatusCode.SESSION_EXPIRED: SessionExpired,
- StatusCode.CANCELLED: Cancelled,
- StatusCode.UNDETERMINED: Undetermined,
- StatusCode.UNSUPPORTED: Unsupported,
- StatusCode.SESSION_BUSY: SessionBusy,
- StatusCode.EXTERNAL_ERROR: ExternalError,
-}
-
-
-def _process_response(response_proto):
- if response_proto.status not in _success_status_codes:
- exc_obj = _server_side_error_map.get(response_proto.status)
- raise exc_obj(_format_response(response_proto), response_proto.issues)
diff --git a/contrib/python/ydb/py2/ydb/operation.py b/contrib/python/ydb/py2/ydb/operation.py
deleted file mode 100644
index 6084ef0f18..0000000000
--- a/contrib/python/ydb/py2/ydb/operation.py
+++ /dev/null
@@ -1,101 +0,0 @@
-# -*- coding: utf-8 -*-
-from . import issues
-from . import _apis
-
-
-def _forget_operation_request(operation_id):
- request = _apis.ydb_operation.ForgetOperationRequest(id=operation_id)
- return request
-
-
-def _forget_operation_response(rpc_state, response): # pylint: disable=W0613
- issues._process_response(response)
-
-
-def _cancel_operation_request(operation_id):
- request = _apis.ydb_operation.CancelOperationRequest(id=operation_id)
- return request
-
-
-def _cancel_operation_response(rpc_state, response): # pylint: disable=W0613
- issues._process_response(response)
-
-
-def _get_operation_request(self):
- request = _apis.ydb_operation.GetOperationRequest(id=self.id)
- return request
-
-
-class OperationClient(object):
- def __init__(self, driver):
- self._driver = driver
-
- def cancel(self, operation_id, settings=None):
- return self._driver(
- _cancel_operation_request(operation_id),
- _apis.OperationService.Stub,
- _apis.OperationService.CancelOperation,
- _cancel_operation_response,
- settings,
- )
-
- def forget(self, operation_id, settings=None):
- return self._driver(
- _forget_operation_request(operation_id),
- _apis.OperationService.Stub,
- _apis.OperationService.ForgetOperation,
- _forget_operation_response,
- settings,
- )
-
-
-class Operation(object):
- __slots__ = ("id", "_driver", "self_cls")
-
- def __init__(self, rpc_state, response, driver=None): # pylint: disable=W0613
- # implement proper interface a bit later
- issues._process_response(response.operation)
- self.id = response.operation.id
- self._driver = driver
- # self.ready = operation.ready
-
- def __repr__(self):
- return self.__str__()
-
- def __str__(self):
- return "<Operation %s>" % (self.id,)
-
- def _ensure_implements(self):
- if self._driver is None:
- raise ValueError("Operation doesn't implement request!")
-
- def cancel(self, settings=None):
- self._ensure_implements()
- return self._driver(
- _cancel_operation_request(self.id),
- _apis.OperationService.Stub,
- _apis.OperationService.CancelOperation,
- _cancel_operation_response,
- settings,
- )
-
- def forget(self, settings=None):
- self._ensure_implements()
- return self._driver(
- _forget_operation_request(self.id),
- _apis.OperationService.Stub,
- _apis.OperationService.ForgetOperation,
- _forget_operation_response,
- settings,
- )
-
- def get(self, settings=None):
- self._ensure_implements()
- return self._driver(
- _get_operation_request(self),
- _apis.OperationService.Stub,
- _apis.OperationService.GetOperation,
- self.__class__,
- settings,
- (self._driver,),
- )
diff --git a/contrib/python/ydb/py2/ydb/pool.py b/contrib/python/ydb/py2/ydb/pool.py
deleted file mode 100644
index dfda0adff2..0000000000
--- a/contrib/python/ydb/py2/ydb/pool.py
+++ /dev/null
@@ -1,528 +0,0 @@
-# -*- coding: utf-8 -*-
-import threading
-import logging
-from concurrent import futures
-import collections
-import random
-
-import six
-
-from . import connection as connection_impl, issues, resolver, _utilities, tracing
-from abc import abstractmethod, ABCMeta
-
-
-logger = logging.getLogger(__name__)
-
-
-class ConnectionsCache(object):
- def __init__(self, use_all_nodes=False, tracer=tracing.Tracer(None)):
- self.tracer = tracer
- self.lock = threading.RLock()
- self.connections = collections.OrderedDict()
- self.connections_by_node_id = collections.OrderedDict()
- self.outdated = collections.OrderedDict()
- self.subscriptions = set()
- self.preferred = collections.OrderedDict()
- self.logger = logging.getLogger(__name__)
- self.use_all_nodes = use_all_nodes
- self.conn_lst_order = (
- (self.connections,)
- if self.use_all_nodes
- else (self.preferred, self.connections)
- )
- self.fast_fail_subscriptions = set()
-
- def add(self, connection, preferred=False):
- if connection is None:
- return False
-
- connection.add_cleanup_callback(self.remove)
- with self.lock:
- if preferred:
- self.preferred[connection.endpoint] = connection
-
- self.connections_by_node_id[connection.node_id] = connection
- self.connections[connection.endpoint] = connection
- subscriptions = list(self.subscriptions)
- self.subscriptions.clear()
-
- if len(self.connections) > 0:
- self.complete_discovery(None)
-
- for subscription in subscriptions:
- subscription.set_result(None)
- return True
-
- def _on_done_callback(self, subscription):
- """
- A done callback for the subscription future
- :param subscription: A subscription
- :return: None
- """
- with self.lock:
- try:
- self.subscriptions.remove(subscription)
- except KeyError:
- return subscription
-
- @property
- def size(self):
- with self.lock:
- return len(self.connections) - len(self.outdated)
-
- def already_exists(self, endpoint):
- with self.lock:
- return endpoint in self.connections
-
- def values(self):
- with self.lock:
- return list(self.connections.values())
-
- def make_outdated(self, connection):
- with self.lock:
- self.outdated[connection.endpoint] = connection
- return self
-
- def cleanup_outdated(self):
- with self.lock:
- outdated_connections = list(self.outdated.values())
- for outdated_connection in outdated_connections:
- outdated_connection.close()
- return self
-
- def cleanup(self):
- with self.lock:
- actual_connections = list(self.connections.values())
- for connection in actual_connections:
- connection.close()
-
- def complete_discovery(self, error):
- with self.lock:
- for subscription in self.fast_fail_subscriptions:
- if error is None:
- subscription.set_result(None)
- else:
- subscription.set_exception(error)
-
- self.fast_fail_subscriptions.clear()
-
- def add_fast_fail(self):
- with self.lock:
- subscription = futures.Future()
- if len(self.connections) > 0:
- subscription.set_result(None)
- return subscription
-
- self.fast_fail_subscriptions.add(subscription)
- return subscription
-
- def subscribe(self):
- with self.lock:
- subscription = futures.Future()
- if len(self.connections) > 0:
- subscription.set_result(None)
- return subscription
- self.subscriptions.add(subscription)
- subscription.add_done_callback(self._on_done_callback)
- return subscription
-
- @tracing.with_trace()
- def get(self, preferred_endpoint=None):
- with self.lock:
- if (
- preferred_endpoint is not None
- and preferred_endpoint.node_id in self.connections_by_node_id
- ):
- return self.connections_by_node_id[preferred_endpoint.node_id]
-
- if (
- preferred_endpoint is not None
- and preferred_endpoint.endpoint in self.connections
- ):
- return self.connections[preferred_endpoint]
-
- for conn_lst in self.conn_lst_order:
- try:
- endpoint, connection = conn_lst.popitem(last=False)
- conn_lst[endpoint] = connection
- tracing.trace(self.tracer, {"found_in_lists": True})
- return connection
- except KeyError:
- continue
-
- raise issues.ConnectionLost("Couldn't find valid connection")
-
- def remove(self, connection):
- with self.lock:
- self.connections_by_node_id.pop(connection.node_id, None)
- self.preferred.pop(connection.endpoint, None)
- self.connections.pop(connection.endpoint, None)
- self.outdated.pop(connection.endpoint, None)
-
-
-class Discovery(threading.Thread):
- def __init__(self, store, driver_config):
- """
- A timer thread that implements endpoints discovery logic
- :param store: A store with endpoints
- :param driver_config: An instance of DriverConfig
- """
- super(Discovery, self).__init__()
- self.logger = logger.getChild(self.__class__.__name__)
- self.condition = threading.Condition()
- self.daemon = True
- self._cache = store
- self._driver_config = driver_config
- self._resolver = resolver.DiscoveryEndpointsResolver(self._driver_config)
- self._base_discovery_interval = 60
- self._ready_timeout = 4
- self._discovery_request_timeout = 2
- self._should_stop = threading.Event()
- self._max_size = 9
- self._base_emergency_retry_interval = 1
- self._ssl_required = False
- if driver_config.root_certificates is not None or driver_config.secure_channel:
- self._ssl_required = True
-
- def discovery_debug_details(self):
- return self._resolver.debug_details()
-
- def _emergency_retry_interval(self):
- return (1 + random.random()) * self._base_emergency_retry_interval
-
- def _discovery_interval(self):
- return (1 + random.random()) * self._base_discovery_interval
-
- def notify_disconnected(self):
- self._send_wake_up()
-
- def _send_wake_up(self):
- acquired = self.condition.acquire(blocking=False)
-
- if not acquired:
- return
-
- self.condition.notify_all()
- self.condition.release()
-
- def _handle_empty_database(self):
- if self._cache.size > 0:
- return True
-
- return self._cache.add(
- connection_impl.Connection.ready_factory(
- self._driver_config.endpoint, self._driver_config, self._ready_timeout
- )
- )
-
- def execute_discovery(self):
- if self._driver_config.database is None:
- return self._handle_empty_database()
-
- with self._resolver.context_resolve() as resolve_details:
- if resolve_details is None:
- return False
-
- resolved_endpoints = set(
- endpoint
- for resolved_endpoint in resolve_details.endpoints
- for endpoint, endpoint_options in resolved_endpoint.endpoints_with_options()
- )
- for cached_endpoint in self._cache.values():
- if cached_endpoint.endpoint not in resolved_endpoints:
- self._cache.make_outdated(cached_endpoint)
-
- for resolved_endpoint in resolve_details.endpoints:
- if self._ssl_required and not resolved_endpoint.ssl:
- continue
-
- if not self._ssl_required and resolved_endpoint.ssl:
- continue
-
- preferred = resolve_details.self_location == resolved_endpoint.location
-
- for (
- endpoint,
- endpoint_options,
- ) in resolved_endpoint.endpoints_with_options():
- if (
- self._cache.size >= self._max_size
- or self._cache.already_exists(endpoint)
- ):
- continue
-
- ready_connection = connection_impl.Connection.ready_factory(
- endpoint,
- self._driver_config,
- self._ready_timeout,
- endpoint_options=endpoint_options,
- )
- self._cache.add(ready_connection, preferred)
-
- self._cache.cleanup_outdated()
-
- return self._cache.size > 0
-
- def stop(self):
- self._should_stop.set()
- self._send_wake_up()
-
- def run(self):
- with self.condition:
- while True:
- if self._should_stop.is_set():
- break
-
- successful = self.execute_discovery()
- if successful:
- self._cache.complete_discovery(None)
- else:
- self._cache.complete_discovery(
- issues.ConnectionFailure(str(self.discovery_debug_details()))
- )
-
- if self._should_stop.is_set():
- break
-
- interval = (
- self._discovery_interval()
- if successful
- else self._emergency_retry_interval()
- )
- self.condition.wait(interval)
-
- self._cache.cleanup()
- self.logger.info("Successfully terminated discovery process")
-
-
-@six.add_metaclass(ABCMeta)
-class IConnectionPool:
- @abstractmethod
- def __init__(self, driver_config):
- """
- An object that encapsulates discovery logic and provides ability to execute user requests
- on discovered endpoints.
- :param driver_config: An instance of DriverConfig
- """
- pass
-
- @abstractmethod
- def stop(self, timeout=10):
- """
- Stops underlying discovery process and cleanups
- :param timeout: A timeout to wait for stop completion
- :return: None
- """
- pass
-
- @abstractmethod
- def wait(self, timeout=None, fail_fast=False):
- """
- Waits for endpoints to be are available to serve user requests
- :param timeout: A timeout to wait in seconds
- :param fail_fast: Should wait fail fast?
- :return: None
- """
-
- @abstractmethod
- def discovery_debug_details(self):
- """
- Returns debug string about last errors
- :return:
- """
- pass
-
- @abstractmethod
- def __call__(
- self,
- request,
- stub,
- rpc_name,
- wrap_result=None,
- settings=None,
- wrap_args=(),
- preferred_endpoint=None,
- ):
- """
- Sends request constructed by client library
- :param request: A request constructed by client
- :param stub: A stub instance to wrap channel
- :param rpc_name: A name of RPC to be executed
- :param wrap_result: A callable that intercepts call and wraps received response
- :param settings: An instance of BaseRequestSettings that can be used
- for RPC metadata construction
- :param wrap_args: And arguments to be passed into wrap_result callable
- :return: A result of computation
- """
- pass
-
-
-class ConnectionPool(IConnectionPool):
- def __init__(self, driver_config):
- """
- An object that encapsulates discovery logic and provides ability to execute user requests
- on discovered endpoints.
-
- :param driver_config: An instance of DriverConfig
- """
- self._driver_config = driver_config
- self._store = ConnectionsCache(
- driver_config.use_all_nodes, driver_config.tracer
- )
- self.tracer = driver_config.tracer
- self._grpc_init = connection_impl.Connection(
- self._driver_config.endpoint, self._driver_config
- )
- self._discovery_thread = Discovery(self._store, self._driver_config)
- self._discovery_thread.start()
- self._stopped = False
- self._stop_guard = threading.Lock()
-
- def stop(self, timeout=10):
- """
- Stops underlying discovery process and cleanups
-
- :param timeout: A timeout to wait for stop completion
- :return: None
- """
- with self._stop_guard:
- if self._stopped:
- return
-
- self._stopped = True
- self._discovery_thread.stop()
- self._grpc_init.close()
- self._discovery_thread.join(timeout)
-
- def async_wait(self, fail_fast=False):
- """
- Returns a future to subscribe on endpoints availability.
-
- :return: A concurrent.futures.Future instance.
- """
- if fail_fast:
- return self._store.add_fast_fail()
- return self._store.subscribe()
-
- def wait(self, timeout=None, fail_fast=False):
- """
- Waits for endpoints to be are available to serve user requests
-
- :param timeout: A timeout to wait in seconds
- :return: None
- """
- if fail_fast:
- self._store.add_fast_fail().result(timeout)
- else:
- self._store.subscribe().result(timeout)
-
- def _on_disconnected(self, connection):
- """
- Removes bad discovered endpoint and triggers discovery process
-
- :param connection: A disconnected connection
- :return: None
- """
- connection.close()
- self._discovery_thread.notify_disconnected()
-
- def discovery_debug_details(self):
- return self._discovery_thread.discovery_debug_details()
-
- @tracing.with_trace()
- def __call__(
- self,
- request,
- stub,
- rpc_name,
- wrap_result=None,
- settings=None,
- wrap_args=(),
- preferred_endpoint=None,
- ):
- """
- Synchronously sends request constructed by client library
-
- :param request: A request constructed by client
- :param stub: A stub instance to wrap channel
- :param rpc_name: A name of RPC to be executed
- :param wrap_result: A callable that intercepts call and wraps received response
- :param settings: An instance of BaseRequestSettings that can be used
- for RPC metadata construction
- :param wrap_args: And arguments to be passed into wrap_result callable
-
- :return: A result of computation
- """
- tracing.trace(
- self.tracer, {"request": request, "stub": stub, "rpc_name": rpc_name}
- )
- try:
- connection = self._store.get(preferred_endpoint)
- except Exception:
- self._discovery_thread.notify_disconnected()
- raise
-
- res = connection(
- request,
- stub,
- rpc_name,
- wrap_result,
- settings,
- wrap_args,
- lambda: self._on_disconnected(connection),
- )
- tracing.trace(
- self.tracer, {"response": res}, trace_level=tracing.TraceLevel.DEBUG
- )
- return res
-
- @_utilities.wrap_async_call_exceptions
- def future(
- self,
- request,
- stub,
- rpc_name,
- wrap_result=None,
- settings=None,
- wrap_args=(),
- preferred_endpoint=None,
- ):
- """
- Sends request constructed by client
-
- :param request: A request constructed by client
- :param stub: A stub instance to wrap channel
- :param rpc_name: A name of RPC to be executed
- :param wrap_result: A callable that intercepts call and wraps received response
- :param settings: An instance of BaseRequestSettings that can be used\
- for RPC metadata construction
- :param wrap_args: And arguments to be passed into wrap_result callable
-
- :return: A future of computation
- """
- try:
- connection = self._store.get(preferred_endpoint)
- except Exception:
- self._discovery_thread.notify_disconnected()
- raise
-
- return connection.future(
- request,
- stub,
- rpc_name,
- wrap_result,
- settings,
- wrap_args,
- lambda: self._on_disconnected(connection),
- )
-
- def __enter__(self):
- """
- In some cases (scripts, for example) this context manager can be used.
-
- :return:
- """
- return self
-
- def __exit__(self, exc_type, exc_val, exc_tb):
- self.stop()
diff --git a/contrib/python/ydb/py2/ydb/resolver.py b/contrib/python/ydb/py2/ydb/resolver.py
deleted file mode 100644
index b40ae984dc..0000000000
--- a/contrib/python/ydb/py2/ydb/resolver.py
+++ /dev/null
@@ -1,209 +0,0 @@
-# -*- coding: utf-8 -*-
-import contextlib
-import logging
-import threading
-import random
-import itertools
-from . import connection as conn_impl, issues, settings as settings_impl, _apis
-
-logger = logging.getLogger(__name__)
-
-
-class EndpointInfo(object):
- __slots__ = (
- "address",
- "endpoint",
- "location",
- "port",
- "ssl",
- "ipv4_addrs",
- "ipv6_addrs",
- "ssl_target_name_override",
- "node_id",
- )
-
- def __init__(self, endpoint_info):
- self.address = endpoint_info.address
- self.endpoint = "%s:%s" % (endpoint_info.address, endpoint_info.port)
- self.location = endpoint_info.location
- self.port = endpoint_info.port
- self.ssl = endpoint_info.ssl
- self.ipv4_addrs = tuple(endpoint_info.ip_v4)
- self.ipv6_addrs = tuple(endpoint_info.ip_v6)
- self.ssl_target_name_override = endpoint_info.ssl_target_name_override
- self.node_id = endpoint_info.node_id
-
- def endpoints_with_options(self):
- ssl_target_name_override = None
- if self.ssl:
- if self.ssl_target_name_override:
- ssl_target_name_override = self.ssl_target_name_override
- elif self.ipv6_addrs or self.ipv4_addrs:
- ssl_target_name_override = self.address
-
- endpoint_options = conn_impl.EndpointOptions(
- ssl_target_name_override=ssl_target_name_override, node_id=self.node_id
- )
-
- if self.ipv6_addrs or self.ipv4_addrs:
- for ipv6addr in self.ipv6_addrs:
- yield ("ipv6:[%s]:%s" % (ipv6addr, self.port), endpoint_options)
- for ipv4addr in self.ipv4_addrs:
- yield ("ipv4:%s:%s" % (ipv4addr, self.port), endpoint_options)
- else:
- yield (self.endpoint, endpoint_options)
-
- def __str__(self):
- return "<Endpoint %s, location %s, ssl: %s>" % (
- self.endpoint,
- self.location,
- self.ssl,
- )
-
- def __repr__(self):
- return self.__str__()
-
- def __hash__(self):
- return hash(self.endpoint)
-
- def __eq__(self, other):
- if not hasattr(other, "endpoint"):
- return False
-
- return self.endpoint == other.endpoint
-
-
-def _list_endpoints_request_factory(connection_params):
- request = _apis.ydb_discovery.ListEndpointsRequest()
- request.database = connection_params.database
- return request
-
-
-class DiscoveryResult(object):
- def __init__(self, self_location, endpoints):
- self.self_location = self_location
- self.endpoints = endpoints
-
- def __str__(self):
- return "DiscoveryResult <self_location: %s, endpoints %s>" % (
- self.self_location,
- self.endpoints,
- )
-
- def __repr__(self):
- return self.__str__()
-
- @classmethod
- def from_response(cls, rpc_state, response, use_all_nodes=False):
- issues._process_response(response.operation)
- message = _apis.ydb_discovery.ListEndpointsResult()
- response.operation.result.Unpack(message)
- unique_local_endpoints = set()
- unique_different_endpoints = set()
- for info in message.endpoints:
- if info.location == message.self_location:
- unique_local_endpoints.add(EndpointInfo(info))
- else:
- unique_different_endpoints.add(EndpointInfo(info))
-
- result = []
- unique_local_endpoints = list(unique_local_endpoints)
- unique_different_endpoints = list(unique_different_endpoints)
- if use_all_nodes:
- result.extend(unique_local_endpoints)
- result.extend(unique_different_endpoints)
- random.shuffle(result)
- else:
- random.shuffle(unique_local_endpoints)
- random.shuffle(unique_different_endpoints)
- result.extend(unique_local_endpoints)
- result.extend(unique_different_endpoints)
-
- return cls(message.self_location, result)
-
-
-class DiscoveryEndpointsResolver(object):
- def __init__(self, driver_config):
- self.logger = logger.getChild(self.__class__.__name__)
- self._driver_config = driver_config
- self._ready_timeout = getattr(
- self._driver_config, "discovery_request_timeout", 10
- )
- self._lock = threading.Lock()
- self._debug_details_history_size = 20
- self._debug_details_items = []
- self._endpoints = []
- self._endpoints.append(driver_config.endpoint)
- self._endpoints.extend(driver_config.endpoints)
- random.shuffle(self._endpoints)
- self._endpoints_iter = itertools.cycle(self._endpoints)
-
- def _add_debug_details(self, message, *args):
- self.logger.debug(message, *args)
- message = message % args
- with self._lock:
- self._debug_details_items.append(message)
- if len(self._debug_details_items) > self._debug_details_history_size:
- self._debug_details_items.pop()
-
- def debug_details(self):
- """
- Returns last resolver errors as a debug string.
- """
- with self._lock:
- return "\n".join(self._debug_details_items)
-
- def resolve(self):
- with self.context_resolve() as result:
- return result
-
- @contextlib.contextmanager
- def context_resolve(self):
- self.logger.debug("Preparing initial endpoint to resolve endpoints")
- endpoint = next(self._endpoints_iter)
- initial = conn_impl.Connection.ready_factory(
- endpoint, self._driver_config, ready_timeout=self._ready_timeout
- )
- if initial is None:
- self._add_debug_details(
- 'Failed to establish connection to YDB discovery endpoint: "%s". Check endpoint correctness.'
- % endpoint
- )
- yield
- return
-
- self.logger.debug(
- "Resolving endpoints for database %s", self._driver_config.database
- )
- try:
- resolved = initial(
- _list_endpoints_request_factory(self._driver_config),
- _apis.DiscoveryService.Stub,
- _apis.DiscoveryService.ListEndpoints,
- DiscoveryResult.from_response,
- settings=settings_impl.BaseRequestSettings().with_timeout(
- self._ready_timeout
- ),
- wrap_args=(self._driver_config.use_all_nodes,),
- )
-
- self._add_debug_details(
- "Resolved endpoints for database %s: %s",
- self._driver_config.database,
- resolved,
- )
-
- yield resolved
- except Exception as e:
-
- self._add_debug_details(
- 'Failed to resolve endpoints for database %s. Endpoint: "%s". Error details:\n %s',
- self._driver_config.database,
- endpoint,
- e,
- )
-
- yield
-
- finally:
- initial.close()
diff --git a/contrib/python/ydb/py2/ydb/scheme.py b/contrib/python/ydb/py2/ydb/scheme.py
deleted file mode 100644
index 4e8b716d5f..0000000000
--- a/contrib/python/ydb/py2/ydb/scheme.py
+++ /dev/null
@@ -1,493 +0,0 @@
-# -*- coding: utf-8 -*-
-import abc
-import enum
-import six
-from abc import abstractmethod
-from . import issues, operation, settings as settings_impl, _apis
-
-
-@enum.unique
-class SchemeEntryType(enum.IntEnum):
- """
- Enumerates all available entry types.
- """
-
- TYPE_UNSPECIFIED = 0
- DIRECTORY = 1
- TABLE = 2
- PERS_QUEUE_GROUP = 3
- DATABASE = 4
- RTMR_VOLUME = 5
- BLOCK_STORE_VOLUME = 6
- COORDINATION_NODE = 7
- COLUMN_TABLE = 13
- SEQUENCE = 15
- REPLICATION = 16
- TOPIC = 17
-
- @staticmethod
- def is_table(entry):
- """
- :param entry: A scheme entry to check
- :return: True if scheme entry is a table and False otherwise
- """
- return entry == SchemeEntryType.TABLE
-
- @staticmethod
- def is_directory(entry):
- """
- :param entry: A scheme entry to check
- :return: True if scheme entry is a directory and False otherwise
- """
- return entry == SchemeEntryType.DIRECTORY
-
- @staticmethod
- def is_database(entry):
- """
- :param entry: A scheme entry to check
- :return: True if scheme entry is a database and False otherwise
- """
- return entry == SchemeEntryType.DATABASE
-
- @staticmethod
- def is_coordination_node(entry):
- """
- :param entry: A scheme entry to check
- :return: True if scheme entry is a coordination node and False otherwise
- """
- return entry == SchemeEntryType.COORDINATION_NODE
-
- @staticmethod
- def is_directory_or_database(entry):
- """
- :param entry: A scheme entry to check
- :return: True if scheme entry is a directory or database and False otherwise
- """
- return entry == SchemeEntryType.DATABASE or entry == SchemeEntryType.DIRECTORY
-
-
-class SchemeEntry(object):
- __slots__ = (
- "name",
- "owner",
- "type",
- "effective_permissions",
- "permissions",
- "size_bytes",
- )
-
- def __init__(
- self,
- name,
- owner,
- type,
- effective_permissions,
- permissions,
- size_bytes,
- *args,
- **kwargs
- ):
- """
- Represents a scheme entry.
- :param name: A name of a scheme entry
- :param owner: A owner of a scheme entry
- :param type: A type of scheme entry
- :param effective_permissions: A list of effective permissions applied to this scheme entry
- :param permissions: A list of permissions applied to this scheme entry
- :param size_bytes: Size of entry in bytes
- """
- self.name = name
- self.owner = owner
- self.type = type
- self.effective_permissions = effective_permissions
- self.permissions = permissions
- self.size_bytes = size_bytes
-
- def is_directory(self):
- """
- :return: True if scheme entry is a directory and False otherwise
- """
- return SchemeEntryType.is_directory(self.type)
-
- def is_table(self):
- """
- :return: True if scheme entry is a table and False otherwise
- """
- return SchemeEntryType.is_table(self.type)
-
- def is_database(self):
- """
- :return: True if scheme entry is a database and False otherwise
- """
- return SchemeEntryType.is_database(self.type)
-
- def is_directory_or_database(self):
- """
- :return: True if scheme entry is a directory or a database and False otherwise
- """
- return SchemeEntryType.is_directory_or_database(self.type)
-
- def is_coordination_node(self):
- """
- :return: True if scheme entry is a coordination node and False otherwise
- """
- return SchemeEntryType.is_coordination_node(self.type)
-
-
-class Directory(SchemeEntry):
- __slots__ = ("children",)
-
- def __init__(
- self,
- name,
- owner,
- type,
- effective_permissions,
- permissions,
- children,
- *args,
- **kwargs
- ):
- """
- Represents a directory scheme entry.
- :param name: A name of a scheme entry
- :param owner: A owner of a scheme entry
- :param type: A type of scheme entry
- :param effective_permissions: A list of effective permissions applied to this scheme entry
- :param permissions: A list of permissions applied to this scheme entry
- :param children: A list of children
- """
- super(Directory, self).__init__(
- name, owner, type, effective_permissions, permissions, 0
- )
- self.children = children
-
-
-def _describe_path_request_factory(path):
- request = _apis.ydb_scheme.DescribePathRequest()
- request.path = path
- return request
-
-
-def _list_directory_request_factory(path):
- request = _apis.ydb_scheme.ListDirectoryRequest()
- request.path = path
- return request
-
-
-def _remove_directory_request_factory(path):
- request = _apis.ydb_scheme.RemoveDirectoryRequest()
- request.path = path
- return request
-
-
-def _make_directory_request_factory(path):
- request = _apis.ydb_scheme.MakeDirectoryRequest()
- request.path = path
- return request
-
-
-class MakeDirectorySettings(settings_impl.BaseRequestSettings):
- pass
-
-
-class RemoveDirectorySettings(settings_impl.BaseRequestSettings):
- pass
-
-
-class ListDirectorySettings(settings_impl.BaseRequestSettings):
- pass
-
-
-class DescribePathSettings(settings_impl.BaseRequestSettings):
- pass
-
-
-class ModifyPermissionsSettings(settings_impl.BaseRequestSettings):
- def __init__(self):
- super(ModifyPermissionsSettings, self).__init__()
- self._pb = _apis.ydb_scheme.ModifyPermissionsRequest()
-
- def grant_permissions(self, subject, permission_names):
- permission_action = self._pb.actions.add()
- permission_action.grant.MergeFrom(
- Permissions(subject, permission_names).to_pb()
- )
- return self
-
- def revoke_permissions(self, subject, permission_names):
- permission_action = self._pb.actions.add()
- permission_action.revoke.MergeFrom(
- Permissions(subject, permission_names).to_pb()
- )
- return self
-
- def set_permissions(self, subject, permission_names):
- permission_action = self._pb.actions.add()
- permission_action.set.MergeFrom(Permissions(subject, permission_names).to_pb())
- return self
-
- def change_owner(self, owner):
- permission_action = self._pb.actions.add()
- permission_action.change_owner = owner
- return self
-
- def clear_permissions(self):
- self._pb.clear_permissions = True
- return self
-
- def to_pb(self):
- return self._pb
-
-
-class Permissions(object):
- __slots__ = ("subject", "permission_names")
-
- def __init__(self, subject, permission_names):
- """
- Represents permissions
- :param subject: A subject of permission names
- :param permission_names: A list of permission names
- """
- self.subject = subject
- self.permission_names = permission_names
-
- def to_pb(self):
- """
- :return: A protocol buffer representation of permissions
- """
- pb = _apis.ydb_scheme.Permissions()
- pb.subject = self.subject
- pb.permission_names.extend(self.permission_names)
- return pb
-
-
-def _modify_permissions_request_factory(path, settings):
- """
- Constructs modify permissions request
- :param path: A path to apply permissions
- :param settings: An instance of ModifyPermissionsSettings
- :return: A constructed request
- """
- modify_permissions_request = settings.to_pb()
- modify_permissions_request.path = path
- return modify_permissions_request
-
-
-def _wrap_permissions(permissions):
- """
- Wraps permissions protocol buffers into native Python objects
- :param permissions: A protocol buffer representation of permissions
- :return: A iterable of permissions
- """
- return tuple(
- Permissions(permission.subject, permission.permission_names)
- for permission in permissions
- )
-
-
-def _wrap_scheme_entry(entry_pb, scheme_entry_cls=None, *args, **kwargs):
- """
- Wraps scheme entry into native Python objects.
- :param entry_pb: A protocol buffer representation of a scheme entry
- :param scheme_entry_cls: A native Python class that represents scheme entry (
- by default that is generic SchemeEntry)
- :param args: A list of optional arguments
- :param kwargs: A dictionary of with optional arguments
- :return: A native Python reprensentation of scheme entry
- """
- scheme_entry_cls = SchemeEntry if scheme_entry_cls is None else scheme_entry_cls
- return scheme_entry_cls(
- entry_pb.name,
- entry_pb.owner,
- SchemeEntryType(entry_pb.type),
- _wrap_permissions(entry_pb.effective_permissions),
- _wrap_permissions(entry_pb.permissions),
- entry_pb.size_bytes,
- *args,
- **kwargs
- )
-
-
-def _wrap_list_directory_response(rpc_state, response):
- """
- Wraps list directory response
- :param response: A list directory response
- :return: A directory
- """
- issues._process_response(response.operation)
- message = _apis.ydb_scheme.ListDirectoryResult()
- response.operation.result.Unpack(message)
- children = []
- supported_items = set(i.value for i in SchemeEntryType)
- for children_item in message.children:
- if children_item.type not in supported_items:
- continue
-
- children.append(_wrap_scheme_entry(children_item))
-
- return Directory(
- message.self.name,
- message.self.owner,
- SchemeEntryType(message.self.type),
- _wrap_permissions(message.self.effective_permissions),
- _wrap_permissions(message.self.permissions),
- tuple(children),
- )
-
-
-def _wrap_describe_path_response(rpc_state, response):
- issues._process_response(response.operation)
- message = _apis.ydb_scheme.DescribePathResult()
- response.operation.result.Unpack(message)
- return _wrap_scheme_entry(message.self)
-
-
-@six.add_metaclass(abc.ABCMeta)
-class ISchemeClient:
- @abstractmethod
- def __init__(self, driver):
- pass
-
- @abstractmethod
- def make_directory(self, path, settings):
- pass
-
- @abstractmethod
- def remove_directory(self, path, settings):
- pass
-
- @abstractmethod
- def list_directory(self, path, settings):
- pass
-
- @abstractmethod
- def describe_path(self, path, settings):
- pass
-
- @abstractmethod
- def modify_permissions(self, path, settings):
- """
- Modifies permissions for provided scheme entry
-
- :param path: A path of scheme entry
- :param settings: An instance of ModifyPermissionsSettings
-
- :return: An operation if success or exception on case of failure
- """
- pass
-
-
-class BaseSchemeClient(ISchemeClient):
- __slots__ = ("_driver",)
-
- def __init__(self, driver):
- self._driver = driver
-
- def make_directory(self, path, settings=None):
- return self._driver(
- _make_directory_request_factory(path),
- _apis.SchemeService.Stub,
- _apis.SchemeService.MakeDirectory,
- operation.Operation,
- settings,
- )
-
- def remove_directory(self, path, settings=None):
- return self._driver(
- _remove_directory_request_factory(path),
- _apis.SchemeService.Stub,
- _apis.SchemeService.RemoveDirectory,
- operation.Operation,
- settings,
- )
-
- def list_directory(self, path, settings=None):
- return self._driver(
- _list_directory_request_factory(path),
- _apis.SchemeService.Stub,
- _apis.SchemeService.ListDirectory,
- _wrap_list_directory_response,
- settings,
- )
-
- def describe_path(self, path, settings=None):
- return self._driver(
- _describe_path_request_factory(path),
- _apis.SchemeService.Stub,
- _apis.SchemeService.DescribePath,
- _wrap_describe_path_response,
- settings,
- )
-
- def modify_permissions(self, path, settings):
- """
- Modifies permissions for provided scheme entry
-
- :param path: A path of scheme entry
- :param settings: An instance of ModifyPermissionsSettings
-
- :return: An operation if success or exception on case of failure
- """
- return self._driver(
- _modify_permissions_request_factory(path, settings),
- _apis.SchemeService.Stub,
- _apis.SchemeService.ModifyPermissions,
- operation.Operation,
- settings,
- )
-
-
-class SchemeClient(BaseSchemeClient):
- def async_make_directory(self, path, settings=None):
- return self._driver.future(
- _make_directory_request_factory(path),
- _apis.SchemeService.Stub,
- _apis.SchemeService.MakeDirectory,
- operation.Operation,
- settings,
- )
-
- def async_remove_directory(self, path, settings=None):
- return self._driver.future(
- _remove_directory_request_factory(path),
- _apis.SchemeService.Stub,
- _apis.SchemeService.RemoveDirectory,
- operation.Operation,
- settings,
- )
-
- def async_list_directory(self, path, settings=None):
- return self._driver.future(
- _list_directory_request_factory(path),
- _apis.SchemeService.Stub,
- _apis.SchemeService.ListDirectory,
- _wrap_list_directory_response,
- settings,
- )
-
- def async_describe_path(self, path, settings=None):
- return self._driver.future(
- _describe_path_request_factory(path),
- _apis.SchemeService.Stub,
- _apis.SchemeService.DescribePath,
- _wrap_describe_path_response,
- settings,
- )
-
- def async_modify_permissions(self, path, settings):
- """
- Modifies permissions for provided scheme entry
-
- :param path: A path of scheme entry
- :param settings: An instance of ModifyPermissionsSettings
-
- :return: An future of computation
- """
- return self._driver.future(
- _modify_permissions_request_factory(path, settings),
- _apis.SchemeService.Stub,
- _apis.SchemeService.ModifyPermissions,
- operation.Operation,
- settings,
- )
diff --git a/contrib/python/ydb/py2/ydb/scripting.py b/contrib/python/ydb/py2/ydb/scripting.py
deleted file mode 100644
index 27c4be5386..0000000000
--- a/contrib/python/ydb/py2/ydb/scripting.py
+++ /dev/null
@@ -1,109 +0,0 @@
-try:
- from ydb.public.api.protos import ydb_scripting_pb2
- from ydb.public.api.grpc import ydb_scripting_v1_pb2_grpc
-except ImportError:
- from contrib.ydb.public.api.protos import ydb_scripting_pb2
- from contrib.ydb.public.api.grpc import ydb_scripting_v1_pb2_grpc
-
-
-from . import issues, convert, settings
-
-
-class TypedParameters(object):
- def __init__(self, parameters_types, parameters_values):
- self.parameters_types = parameters_types
- self.parameters_values = parameters_values
-
-
-class ScriptingClientSettings(object):
- def __init__(self):
- self._native_date_in_result_sets = False
- self._native_datetime_in_result_sets = False
-
- def with_native_date_in_result_sets(self, enabled):
- self._native_date_in_result_sets = enabled
- return self
-
- def with_native_datetime_in_result_sets(self, enabled):
- self._native_datetime_in_result_sets = enabled
- return self
-
-
-class ExplainYqlScriptSettings(settings.BaseRequestSettings):
- MODE_UNSPECIFIED = 0
- MODE_PARSE = 1
- MODE_VALIDATE = 2
- MODE_EXPLAIN = 3
-
- def __init__(self):
- super(ExplainYqlScriptSettings, self).__init__()
- self.mode = False
-
- def with_mode(self, val):
- self.mode = val
- return self
-
-
-def _execute_yql_query_request_factory(script, tp=None, settings=None):
- params = (
- None
- if tp is None
- else convert.parameters_to_pb(tp.parameters_types, tp.parameters_values)
- )
- return ydb_scripting_pb2.ExecuteYqlRequest(script=script, parameters=params)
-
-
-class YqlQueryResult(object):
- def __init__(self, result, scripting_client_settings=None):
- self.result_sets = convert.ResultSets(
- result.result_sets, scripting_client_settings
- )
-
-
-class YqlExplainResult(object):
- def __init__(self, result):
- self.plan = result.plan
-
-
-def _wrap_response(rpc_state, response, scripting_client_settings):
- issues._process_response(response.operation)
- message = ydb_scripting_pb2.ExecuteYqlResult()
- response.operation.result.Unpack(message)
- return YqlQueryResult(message)
-
-
-def _wrap_explain_response(rpc_state, response):
- issues._process_response(response.operation)
- message = ydb_scripting_pb2.ExplainYqlResult()
- response.operation.result.Unpack(message)
- return YqlExplainResult(message)
-
-
-class ScriptingClient(object):
- def __init__(self, driver, scripting_client_settings=None):
- self.driver = driver
- self.scripting_client_settings = (
- scripting_client_settings
- if scripting_client_settings is not None
- else ScriptingClientSettings()
- )
-
- def execute_yql(self, script, typed_parameters=None, settings=None):
- request = _execute_yql_query_request_factory(script, typed_parameters, settings)
- return self.driver(
- request,
- ydb_scripting_v1_pb2_grpc.ScriptingServiceStub,
- "ExecuteYql",
- _wrap_response,
- settings=settings,
- wrap_args=(self.scripting_client_settings,),
- )
-
- def explain_yql(self, script, settings=None):
- return self.driver(
- ydb_scripting_pb2.ExplainYqlRequest(script=script, mode=settings.mode),
- ydb_scripting_v1_pb2_grpc.ScriptingServiceStub,
- "ExplainYql",
- _wrap_explain_response,
- settings=settings,
- )
diff --git a/contrib/python/ydb/py2/ydb/settings.py b/contrib/python/ydb/py2/ydb/settings.py
deleted file mode 100644
index 6739a46fab..0000000000
--- a/contrib/python/ydb/py2/ydb/settings.py
+++ /dev/null
@@ -1,119 +0,0 @@
-# -*- coding: utf-8 -*-
-
-
-class BaseRequestSettings(object):
- __slots__ = (
- "trace_id",
- "request_type",
- "timeout",
- "cancel_after",
- "operation_timeout",
- "tracer",
- "compression",
- "headers",
- "need_rpc_auth",
- )
-
- def __init__(self):
- """
- Request settings to be used for RPC execution
- """
- self.trace_id = None
- self.request_type = None
- self.timeout = None
- self.cancel_after = None
- self.operation_timeout = None
- self.compression = None
- self.need_rpc_auth = True
- self.headers = []
-
- def make_copy(self):
- return (
- BaseRequestSettings()
- .with_trace_id(self.trace_id)
- .with_request_type(self.request_type)
- .with_timeout(self.timeout)
- .with_cancel_after(self.cancel_after)
- .with_operation_timeout(self.operation_timeout)
- .with_compression(self.compression)
- .with_need_rpc_auth(self.need_rpc_auth)
- )
-
- def with_compression(self, compression):
- """
- Enables compression for the specific RPC
- :param compression: An RPCCompression enum value.
- :return The self instance.
- """
- self.compression = compression
- return self
-
- def with_need_rpc_auth(self, need_rpc_auth):
- self.need_rpc_auth = need_rpc_auth
- return self
-
- def with_header(self, key, value):
- """
- Adds a key-value pair to the request headers.
- :param key: A string with a header key.
- :param value: A string with a header value.
- :return The self instance.
- """
- self.headers.append((key, value))
- return self
-
- def with_trace_id(self, trace_id):
- """
- Includes trace id for RPC headers
- :param trace_id: A trace id string
- :return: The self instance
- """
- self.trace_id = trace_id
- return self
-
- def with_request_type(self, request_type):
- """
- Includes request type for RPC headers
- :param request_type: A request type string
- :return: The self instance
- """
- self.request_type = request_type
- return self
-
- def with_operation_timeout(self, timeout):
- """
- Indicates that client is no longer interested in the result of operation after the specified duration
- starting from the time operation arrives at the server.
- Server will try to stop the execution of operation and if no result is currently available the operation
- will receive TIMEOUT status code, which will be sent back to client if it was waiting for the operation result.
- Timeout of operation does not tell anything about its result, it might be completed successfully
- or cancelled on server.
- :param timeout:
- :return:
- """
- self.operation_timeout = timeout
- return self
-
- def with_cancel_after(self, timeout):
- """
- Server will try to cancel the operation after the specified duration starting from the time
- the operation arrives at server.
- In case of successful cancellation operation will receive CANCELLED status code, which will be
- sent back to client if it was waiting for the operation result.
- In case when cancellation isn't possible, no action will be performed.
- :param timeout:
- :return:
- """
- self.cancel_after = timeout
- return self
-
- def with_timeout(self, timeout):
- """
- Client-side timeout to complete request.
- Since YDB doesn't support request cancellation at this moment, this feature should be
- used properly to avoid server overload.
- :param timeout: timeout value in seconds
- :return: The self instance
- """
- self.timeout = timeout
- return self
diff --git a/contrib/python/ydb/py2/ydb/sqlalchemy/__init__.py b/contrib/python/ydb/py2/ydb/sqlalchemy/__init__.py
deleted file mode 100644
index aa9b2d006c..0000000000
--- a/contrib/python/ydb/py2/ydb/sqlalchemy/__init__.py
+++ /dev/null
@@ -1,298 +0,0 @@
-"""
-Experimental
-Work in progress, breaking changes are possible.
-"""
-
-from __future__ import absolute_import, unicode_literals
-
-
-try:
- import ydb
- from ydb.dbapi.errors import NotSupportedError
- from ydb.sqlalchemy.types import UInt32, UInt64
-
- from sqlalchemy.engine.default import DefaultDialect
- from sqlalchemy.sql.compiler import (
- IdentifierPreparer,
- GenericTypeCompiler,
- SQLCompiler,
- )
- from sqlalchemy import Table
- from sqlalchemy.sql.elements import ClauseList
- from sqlalchemy.sql import functions
- import sqlalchemy as sa
- from sqlalchemy import exc
- from sqlalchemy.util.compat import inspect_getfullargspec
- from sqlalchemy.sql import literal_column
-
- SQLALCHEMY_VERSION = tuple(sa.__version__.split("."))
- SA_14 = SQLALCHEMY_VERSION >= ("1", "4")
-
- class YqlIdentifierPreparer(IdentifierPreparer):
- def __init__(self, dialect):
- super(YqlIdentifierPreparer, self).__init__(
- dialect,
- initial_quote="`",
- final_quote="`",
- )
-
- def _requires_quotes(self, value):
- # Force all identifiers to get quoted unless already quoted.
- return not (
- value.startswith(self.initial_quote)
- and value.endswith(self.final_quote)
- )
-
- class YqlTypeCompiler(GenericTypeCompiler):
- def visit_VARCHAR(self, type_, **kw):
- return "STRING"
-
- def visit_unicode(self, type_, **kw):
- return "UTF8"
-
- def visit_NVARCHAR(self, type_, **kw):
- return "UTF8"
-
- def visit_TEXT(self, type_, **kw):
- return "UTF8"
-
- def visit_FLOAT(self, type_, **kw):
- return "DOUBLE"
-
- def visit_BOOLEAN(self, type_, **kw):
- return "BOOL"
-
- def visit_uint32(self, type_, **kw):
- return "UInt32"
-
- def visit_uint64(self, type_, **kw):
- return "UInt64"
-
- def visit_uint8(self, type_, **kw):
- return "UInt8"
-
- class ParametrizedFunction(functions.Function):
- __visit_name__ = "parametrized_function"
-
- def __init__(self, name, params, *args, **kwargs):
- super(ParametrizedFunction, self).__init__(name, *args, **kwargs)
- self._func_name = name
- self._func_params = params
- self.params_expr = ClauseList(
- operator=functions.operators.comma_op, group_contents=True, *params
- ).self_group()
-
- class YqlCompiler(SQLCompiler):
- def group_by_clause(self, select, **kw):
- # Hack to ensure it is possible to define labels in groupby.
- kw.update(within_columns_clause=True)
- return super(YqlCompiler, self).group_by_clause(select, **kw)
-
- def visit_lambda(self, lambda_, **kw):
- func = lambda_.func
- spec = inspect_getfullargspec(func)
-
- if spec.varargs:
- raise exc.CompileError("Lambdas with *args are not supported")
-
- try:
- keywords = spec.keywords
- except AttributeError:
- keywords = spec.varkw
-
- if keywords:
- raise exc.CompileError("Lambdas with **kwargs are not supported")
-
- text = "(" + ", ".join("$" + arg for arg in spec.args) + ")" + " -> "
-
- args = [literal_column("$" + arg) for arg in spec.args]
- text += "{ RETURN " + self.process(func(*args), **kw) + " ;}"
-
- return text
-
- def visit_parametrized_function(self, func, **kwargs):
- name = func.name
- name_parts = []
- for name in name.split("::"):
- fname = (
- self.preparer.quote(name)
- if self.preparer._requires_quotes_illegal_chars(name)
- or isinstance(name, sa.sql.elements.quoted_name)
- else name
- )
-
- name_parts.append(fname)
-
- name = "::".join(name_parts)
- params = func.params_expr._compiler_dispatch(self, **kwargs)
- args = self.function_argspec(func, **kwargs)
- return "%(name)s%(params)s%(args)s" % dict(
- name=name, params=params, args=args
- )
-
- def visit_function(self, func, add_to_result_map=None, **kwargs):
- # Copypaste of `sa.sql.compiler.SQLCompiler.visit_function` with
- # `::` as namespace separator instead of `.`
- if add_to_result_map is not None:
- add_to_result_map(func.name, func.name, (), func.type)
-
- disp = getattr(self, "visit_%s_func" % func.name.lower(), None)
- if disp:
- return disp(func, **kwargs)
- else:
- name = sa.sql.compiler.FUNCTIONS.get(func.__class__, None)
- if name:
- if func._has_args:
- name += "%(expr)s"
- else:
- name = func.name
- name = (
- self.preparer.quote(name)
- if self.preparer._requires_quotes_illegal_chars(name)
- or isinstance(name, sa.sql.elements.quoted_name)
- else name
- )
- name = name + "%(expr)s"
- return "::".join(
- [
- (
- self.preparer.quote(tok)
- if self.preparer._requires_quotes_illegal_chars(tok)
- or isinstance(name, sa.sql.elements.quoted_name)
- else tok
- )
- for tok in func.packagenames
- ]
- + [name]
- ) % {"expr": self.function_argspec(func, **kwargs)}
-
- COLUMN_TYPES = {
- ydb.PrimitiveType.Int8: sa.INTEGER,
- ydb.PrimitiveType.Int16: sa.INTEGER,
- ydb.PrimitiveType.Int32: sa.INTEGER,
- ydb.PrimitiveType.Int64: sa.INTEGER,
- ydb.PrimitiveType.Uint8: sa.INTEGER,
- ydb.PrimitiveType.Uint16: sa.INTEGER,
- ydb.PrimitiveType.Uint32: UInt32,
- ydb.PrimitiveType.Uint64: UInt64,
- ydb.PrimitiveType.Float: sa.FLOAT,
- ydb.PrimitiveType.Double: sa.FLOAT,
- ydb.PrimitiveType.String: sa.TEXT,
- ydb.PrimitiveType.Utf8: sa.TEXT,
- ydb.PrimitiveType.Json: sa.JSON,
- ydb.PrimitiveType.JsonDocument: sa.JSON,
- ydb.DecimalType: sa.DECIMAL,
- ydb.PrimitiveType.Yson: sa.TEXT,
- ydb.PrimitiveType.Date: sa.DATE,
- ydb.PrimitiveType.Datetime: sa.DATETIME,
- ydb.PrimitiveType.Timestamp: sa.DATETIME,
- ydb.PrimitiveType.Interval: sa.INTEGER,
- ydb.PrimitiveType.Bool: sa.BOOLEAN,
- ydb.PrimitiveType.DyNumber: sa.TEXT,
- }
-
- def _get_column_info(t):
- nullable = False
- if isinstance(t, ydb.OptionalType):
- nullable = True
- t = t.item
-
- if isinstance(t, ydb.DecimalType):
- return sa.DECIMAL(precision=t.precision, scale=t.scale), nullable
-
- return COLUMN_TYPES[t], nullable
-
- class YqlDialect(DefaultDialect):
- name = "yql"
- supports_alter = False
- max_identifier_length = 63
- supports_sane_rowcount = False
- supports_statement_cache = False
-
- supports_native_enum = False
- supports_native_boolean = True
- supports_smallserial = False
-
- supports_sequences = False
- sequences_optional = True
- preexecute_autoincrement_sequences = True
- postfetch_lastrowid = False
-
- supports_default_values = False
- supports_empty_insert = False
- supports_multivalues_insert = True
- default_paramstyle = "qmark"
-
- isolation_level = None
-
- preparer = YqlIdentifierPreparer
- statement_compiler = YqlCompiler
- type_compiler = YqlTypeCompiler
-
- @staticmethod
- def dbapi():
- import ydb.dbapi
-
- return ydb.dbapi
-
- def _check_unicode_returns(self, *args, **kwargs):
- # Normally, this would do 2 SQL queries, which isn't quite necessary.
- return "conditional"
-
- def get_columns(self, connection, table_name, schema=None, **kw):
- if schema is not None:
- raise NotSupportedError
-
- if isinstance(table_name, Table):
- qt = table_name.name
- else:
- qt = table_name
-
- if SA_14:
- raw_conn = connection.connection
- else:
- raw_conn = connection.raw_connection()
- columns = raw_conn.describe(qt)
- as_compatible = []
- for column in columns:
- col_type, nullable = _get_column_info(column.type)
- as_compatible.append(
- {
- "name": column.name,
- "type": col_type,
- "nullable": nullable,
- }
- )
-
- return as_compatible
-
- def has_table(self, connection, table_name, schema=None):
- if schema is not None:
- raise NotSupportedError
-
- quote = self.identifier_preparer.quote_identifier
- qtable = quote(table_name)
-
- # TODO: use `get_columns` instead.
- statement = "SELECT * FROM " + qtable
- try:
- connection.execute(statement)
- return True
- except Exception:
- return False
-
-except ImportError:
-
- class YqlDialect(object):
- def __init__(self):
- raise RuntimeError("could not import sqlalchemy")
-
-
-def register_dialect(
- name="yql",
- module=__name__,
- cls="YqlDialect",
-):
- import sqlalchemy as sa
-
- return sa.dialects.registry.register(name, module, cls)
diff --git a/contrib/python/ydb/py2/ydb/sqlalchemy/types.py b/contrib/python/ydb/py2/ydb/sqlalchemy/types.py
deleted file mode 100644
index f6e10ccd6f..0000000000
--- a/contrib/python/ydb/py2/ydb/sqlalchemy/types.py
+++ /dev/null
@@ -1,32 +0,0 @@
-try:
- from sqlalchemy.types import Integer
- from sqlalchemy.sql import type_api
- from sqlalchemy.sql.elements import ColumnElement
- from sqlalchemy import util, exc
-except ImportError:
- Integer = object
- ColumnElement = object
-
-
-class UInt32(Integer):
- __visit_name__ = "uint32"
-
-
-class UInt64(Integer):
- __visit_name__ = "uint64"
-
-
-class UInt8(Integer):
- __visit_name__ = "uint8"
-
-
-class Lambda(ColumnElement):
-
- __visit_name__ = "lambda"
-
- def __init__(self, func):
- if not util.callable(func):
- raise exc.ArgumentError("func must be callable")
-
- self.type = type_api.NULLTYPE
- self.func = func
diff --git a/contrib/python/ydb/py2/ydb/table.py b/contrib/python/ydb/py2/ydb/table.py
deleted file mode 100644
index c06652610a..0000000000
--- a/contrib/python/ydb/py2/ydb/table.py
+++ /dev/null
@@ -1,2682 +0,0 @@
-# -*- coding: utf-8 -*-
-import abc
-import ydb
-from abc import abstractmethod
-import logging
-import time
-import random
-import enum
-
-import six
-from . import (
- issues,
- convert,
- settings as settings_impl,
- scheme,
- types,
- _utilities,
- _apis,
- _sp_impl,
- _session_impl,
- _tx_ctx_impl,
- tracing,
-)
-from ._errors import check_retriable_error
-
-try:
- from . import interceptor
-except ImportError:
- interceptor = None
-
-_allow_split_transaction = True
-
-logger = logging.getLogger(__name__)
-
-##################################################################
-# A deprecated aliases in case when direct import has been used #
-##################################################################
-SessionPoolEmpty = issues.SessionPoolEmpty
-DataQuery = types.DataQuery
-
-
-class DescribeTableSettings(settings_impl.BaseRequestSettings):
- def __init__(self):
- super(DescribeTableSettings, self).__init__()
- self.include_shard_key_bounds = False
- self.include_table_stats = False
-
- def with_include_shard_key_bounds(self, value):
- self.include_shard_key_bounds = value
- return self
-
- def with_include_table_stats(self, value):
- self.include_table_stats = value
- return self
-
-
-class ExecDataQuerySettings(settings_impl.BaseRequestSettings):
- def __init__(self):
- super(ExecDataQuerySettings, self).__init__()
- self.keep_in_cache = True
-
- def with_keep_in_cache(self, value):
- self.keep_in_cache = value
- return self
-
-
-class KeyBound(object):
- __slots__ = ("_equal", "value", "type")
-
- def __init__(self, key_value, key_type=None, inclusive=False):
- """
- Represents key bound.
- :param key_value: An iterable with key values
- :param key_type: A type of key
- :param inclusive: A flag that indicates bound includes key provided in the value.
- """
-
- try:
- iter(key_value)
- except TypeError:
- assert False, "value must be iterable!"
-
- if isinstance(key_type, types.TupleType):
- key_type = key_type.proto
-
- self._equal = inclusive
- self.value = key_value
- self.type = key_type
-
- def is_inclusive(self):
- return self._equal
-
- def is_exclusive(self):
- return not self._equal
-
- def __str__(self):
- if self._equal:
- return "InclusiveKeyBound(Tuple%s)" % str(self.value)
- return "ExclusiveKeyBound(Tuple%s)" % str(self.value)
-
- @classmethod
- def inclusive(cls, key_value, key_type):
- return cls(key_value, key_type, True)
-
- @classmethod
- def exclusive(cls, key_value, key_type):
- return cls(key_value, key_type, False)
-
-
-class KeyRange(object):
- __slots__ = ("from_bound", "to_bound")
-
- def __init__(self, from_bound, to_bound):
- self.from_bound = from_bound
- self.to_bound = to_bound
-
- def __repr__(self):
- return self.__str__()
-
- def __str__(self):
- return "KeyRange(%s, %s)" % (str(self.from_bound), str(self.to_bound))
-
-
-class Column(object):
- def __init__(self, name, type, family=None):
- self._name = name
- self._type = type
- self.family = family
-
- def __eq__(self, other):
- return self.name == other.name and self._type.item == other.type.item
-
- @property
- def name(self):
- return self._name
-
- @property
- def type(self):
- return self._type
-
- def with_family(self, family):
- self.family = family
- return self
-
- @property
- def type_pb(self):
- try:
- return self._type.proto
- except Exception:
- return self._type
-
-
-@enum.unique
-class FeatureFlag(enum.IntEnum):
- UNSPECIFIED = 0
- ENABLED = 1
- DISABLED = 2
-
-
-@enum.unique
-class AutoPartitioningPolicy(enum.IntEnum):
- AUTO_PARTITIONING_POLICY_UNSPECIFIED = 0
- DISABLED = 1
- AUTO_SPLIT = 2
- AUTO_SPLIT_MERGE = 3
-
-
-@enum.unique
-class IndexStatus(enum.IntEnum):
- INDEX_STATUS_UNSPECIFIED = 0
- READY = 1
- BUILDING = 2
-
-
-class CachingPolicy(object):
- def __init__(self):
- self._pb = _apis.ydb_table.CachingPolicy()
- self.preset_name = None
-
- def with_preset_name(self, preset_name):
- self._pb.preset_name = preset_name
- self.preset_name = preset_name
- return self
-
- def to_pb(self):
- return self._pb
-
-
-class ExecutionPolicy(object):
- def __init__(self):
- self._pb = _apis.ydb_table.ExecutionPolicy()
- self.preset_name = None
-
- def with_preset_name(self, preset_name):
- self._pb.preset_name = preset_name
- self.preset_name = preset_name
- return self
-
- def to_pb(self):
- return self._pb
-
-
-class CompactionPolicy(object):
- def __init__(self):
- self._pb = _apis.ydb_table.CompactionPolicy()
- self.preset_name = None
-
- def with_preset_name(self, preset_name):
- self._pb.preset_name = preset_name
- self.preset_name = preset_name
- return self
-
- def to_pb(self):
- return self._pb
-
-
-class SplitPoint(object):
- def __init__(self, *args):
- self._value = tuple(args)
-
- @property
- def value(self):
- return self._value
-
-
-class ExplicitPartitions(object):
- def __init__(self, split_points):
- self.split_points = split_points
-
-
-class PartitioningPolicy(object):
- def __init__(self):
- self._pb = _apis.ydb_table.PartitioningPolicy()
- self.preset_name = None
- self.uniform_partitions = None
- self.auto_partitioning = None
- self.explicit_partitions = None
-
- def with_preset_name(self, preset_name):
- self._pb.preset_name = preset_name
- self.preset_name = preset_name
- return self
-
- def with_uniform_partitions(self, uniform_partitions):
- self._pb.uniform_partitions = uniform_partitions
- self.uniform_partitions = uniform_partitions
- return self
-
- def with_explicit_partitions(self, explicit_partitions):
- self.explicit_partitions = explicit_partitions
- return self
-
- def with_auto_partitioning(self, auto_partitioning):
- self._pb.auto_partitioning = auto_partitioning
- self.auto_partitioning = auto_partitioning
- return self
-
- def to_pb(self, table_description):
- if self.explicit_partitions is not None:
- column_types = {}
- pk = set(table_description.primary_key)
- for column in table_description.columns:
- if column.name in pk:
- column_types[column.name] = column.type
-
- for split_point in self.explicit_partitions.split_points:
- typed_value = self._pb.explicit_partitions.split_points.add()
- split_point_type = types.TupleType()
- prefix_size = len(split_point.value)
- for pl_el_id, pk_name in enumerate(table_description.primary_key):
- if pl_el_id >= prefix_size:
- break
-
- split_point_type.add_element(column_types[pk_name])
-
- typed_value.type.MergeFrom(split_point_type.proto)
- typed_value.value.MergeFrom(
- convert.from_native_value(split_point_type.proto, split_point.value)
- )
-
- return self._pb
-
-
-class TableIndex(object):
- def __init__(self, name):
- self._pb = _apis.ydb_table.TableIndex()
- self._pb.name = name
- self.name = name
- self.index_columns = []
- # output only.
- self.status = None
-
- def with_global_index(self):
- self._pb.global_index.SetInParent()
- return self
-
- def with_index_columns(self, *columns):
- for column in columns:
- self._pb.index_columns.append(column)
- self.index_columns.append(column)
- return self
-
- def to_pb(self):
- return self._pb
-
-
-class ReplicationPolicy(object):
- def __init__(self):
- self._pb = _apis.ydb_table.ReplicationPolicy()
- self.preset_name = None
- self.replicas_count = None
- self.allow_promotion = None
- self.create_per_availability_zone = None
-
- def with_preset_name(self, preset_name):
- self._pb.preset_name = preset_name
- self.preset_name = preset_name
- return self
-
- def with_replicas_count(self, replicas_count):
- self._pb.replicas_count = replicas_count
- self.replicas_count = replicas_count
- return self
-
- def with_create_per_availability_zone(self, create_per_availability_zone):
- self._pb.create_per_availability_zone = create_per_availability_zone
- self.create_per_availability_zone = create_per_availability_zone
- return self
-
- def with_allow_promotion(self, allow_promotion):
- self._pb.allow_promotion = allow_promotion
- self.allow_promotion = allow_promotion
- return self
-
- def to_pb(self):
- return self._pb
-
-
-class StoragePool(object):
- def __init__(self, media):
- self.media = media
-
- def to_pb(self):
- return _apis.ydb_table.StoragePool(media=self.media)
-
-
-class StoragePolicy(object):
- def __init__(self):
- self._pb = _apis.ydb_table.StoragePolicy()
- self.preset_name = None
- self.syslog = None
- self.log = None
- self.data = None
- self.keep_in_memory = None
- self.external = None
-
- def with_preset_name(self, preset_name):
- self._pb.preset_name = preset_name
- self.preset_name = preset_name
- return self
-
- def with_syslog_storage_settings(self, syslog_settings):
- self._pb.syslog.MergeFrom(syslog_settings.to_pb())
- self.syslog = syslog_settings
- return self
-
- def with_log_storage_settings(self, log_settings):
- self._pb.log.MergeFrom(log_settings.to_pb())
- self.log = log_settings
- return self
-
- def with_data_storage_settings(self, data_settings):
- self._pb.data.MergeFrom(data_settings.to_pb())
- self.data = data_settings
- return self
-
- def with_external_storage_settings(self, external_settings):
- self._pb.external.MergeFrom(external_settings.to_pb())
- self.external = external_settings
- return self
-
- def with_keep_in_memory(self, keep_in_memory):
- self._pb.keep_in_memory = keep_in_memory
- self.keep_in_memory = keep_in_memory
- return self
-
- def to_pb(self):
- return self._pb
-
-
-class TableProfile(object):
- def __init__(self):
- self.preset_name = None
- self.compaction_policy = None
- self.partitioning_policy = None
- self.storage_policy = None
- self.execution_policy = None
- self.replication_policy = None
- self.caching_policy = None
-
- def with_preset_name(self, preset_name):
- self.preset_name = preset_name
- return self
-
- def with_compaction_policy(self, compaction_policy):
- self.compaction_policy = compaction_policy
- return self
-
- def with_partitioning_policy(self, partitioning_policy):
- self.partitioning_policy = partitioning_policy
- return self
-
- def with_execution_policy(self, execution_policy):
- self.execution_policy = execution_policy
- return self
-
- def with_caching_policy(self, caching_policy):
- self.caching_policy = caching_policy
- return self
-
- def with_storage_policy(self, storage_policy):
- self.storage_policy = storage_policy
- return self
-
- def with_replication_policy(self, replication_policy):
- self.replication_policy = replication_policy
- return self
-
- def to_pb(self, table_description):
- pb = _apis.ydb_table.TableProfile()
-
- if self.preset_name is not None:
- pb.preset_name = self.preset_name
-
- if self.execution_policy is not None:
- pb.execution_policy.MergeFrom(self.execution_policy.to_pb())
-
- if self.storage_policy is not None:
- pb.storage_policy.MergeFrom(self.storage_policy.to_pb())
-
- if self.replication_policy is not None:
- pb.replication_policy.MergeFrom(self.replication_policy.to_pb())
-
- if self.caching_policy is not None:
- pb.caching_policy.MergeFrom(self.caching_policy.to_pb())
-
- if self.compaction_policy is not None:
- pb.compaction_policy.MergeFrom(self.compaction_policy.to_pb())
-
- if self.partitioning_policy is not None:
- pb.partitioning_policy.MergeFrom(
- self.partitioning_policy.to_pb(table_description)
- )
-
- return pb
-
-
-class DateTypeColumnModeSettings(object):
- def __init__(self, column_name, expire_after_seconds=0):
- self.column_name = column_name
- self.expire_after_seconds = expire_after_seconds
-
- def to_pb(self):
- pb = _apis.ydb_table.DateTypeColumnModeSettings()
-
- pb.column_name = self.column_name
- pb.expire_after_seconds = self.expire_after_seconds
-
- return pb
-
-
-@enum.unique
-class ColumnUnit(enum.IntEnum):
- UNIT_UNSPECIFIED = 0
- UNIT_SECONDS = 1
- UNIT_MILLISECONDS = 2
- UNIT_MICROSECONDS = 3
- UNIT_NANOSECONDS = 4
-
-
-class ValueSinceUnixEpochModeSettings(object):
- def __init__(self, column_name, column_unit, expire_after_seconds=0):
- self.column_name = column_name
- self.column_unit = column_unit
- self.expire_after_seconds = expire_after_seconds
-
- def to_pb(self):
- pb = _apis.ydb_table.ValueSinceUnixEpochModeSettings()
-
- pb.column_name = self.column_name
- pb.column_unit = self.column_unit
- pb.expire_after_seconds = self.expire_after_seconds
-
- return pb
-
-
-class TtlSettings(object):
- def __init__(self):
- self.date_type_column = None
- self.value_since_unix_epoch = None
-
- def with_date_type_column(self, column_name, expire_after_seconds=0):
- self.date_type_column = DateTypeColumnModeSettings(
- column_name, expire_after_seconds
- )
- return self
-
- def with_value_since_unix_epoch(
- self, column_name, column_unit, expire_after_seconds=0
- ):
- self.value_since_unix_epoch = ValueSinceUnixEpochModeSettings(
- column_name, column_unit, expire_after_seconds
- )
- return self
-
- def to_pb(self):
- pb = _apis.ydb_table.TtlSettings()
-
- if self.date_type_column is not None:
- pb.date_type_column.MergeFrom(self.date_type_column.to_pb())
- elif self.value_since_unix_epoch is not None:
- pb.value_since_unix_epoch.MergeFrom(self.value_since_unix_epoch.to_pb())
- else:
- raise RuntimeError("Unspecified ttl settings mode")
-
- return pb
-
-
-class TableStats(object):
- def __init__(self):
- self.partitions = None
- self.store_size = 0
-
- def with_store_size(self, store_size):
- self.store_size = store_size
- return self
-
- def with_partitions(self, partitions):
- self.partitions = partitions
- return self
-
-
-class ReadReplicasSettings(object):
- def __init__(self):
- self.per_az_read_replicas_count = 0
- self.any_az_read_replicas_count = 0
-
- def with_any_az_read_replicas_count(self, any_az_read_replicas_count):
- self.any_az_read_replicas_count = any_az_read_replicas_count
- return self
-
- def with_per_az_read_replicas_count(self, per_az_read_replicas_count):
- self.per_az_read_replicas_count = per_az_read_replicas_count
- return self
-
- def to_pb(self):
- pb = _apis.ydb_table.ReadReplicasSettings()
- if self.per_az_read_replicas_count > 0:
- pb.per_az_read_replicas_count = self.per_az_read_replicas_count
- elif self.any_az_read_replicas_count > 0:
- pb.any_az_read_replicas_count = self.any_az_read_replicas_count
- return pb
-
-
-class PartitioningSettings(object):
- def __init__(self):
- self.partitioning_by_size = 0
- self.partition_size_mb = 0
- self.partitioning_by_load = 0
- self.min_partitions_count = 0
- self.max_partitions_count = 0
-
- def with_max_partitions_count(self, max_partitions_count):
- self.max_partitions_count = max_partitions_count
- return self
-
- def with_min_partitions_count(self, min_partitions_count):
- self.min_partitions_count = min_partitions_count
- return self
-
- def with_partitioning_by_load(self, partitioning_by_load):
- self.partitioning_by_load = partitioning_by_load
- return self
-
- def with_partition_size_mb(self, partition_size_mb):
- self.partition_size_mb = partition_size_mb
- return self
-
- def with_partitioning_by_size(self, partitioning_by_size):
- self.partitioning_by_size = partitioning_by_size
- return self
-
- def to_pb(self):
- pb = _apis.ydb_table.PartitioningSettings()
- pb.partitioning_by_size = self.partitioning_by_size
- pb.partition_size_mb = self.partition_size_mb
- pb.partitioning_by_load = self.partitioning_by_load
- pb.min_partitions_count = self.min_partitions_count
- pb.max_partitions_count = self.max_partitions_count
- return pb
-
-
-class StorageSettings(object):
- def __init__(self):
- self.tablet_commit_log0 = None
- self.tablet_commit_log1 = None
- self.external = None
- self.store_external_blobs = 0
-
- def with_store_external_blobs(self, store_external_blobs):
- self.store_external_blobs = store_external_blobs
- return self
-
- def with_external(self, external):
- self.external = external
- return self
-
- def with_tablet_commit_log1(self, tablet_commit_log1):
- self.tablet_commit_log1 = tablet_commit_log1
- return self
-
- def with_tablet_commit_log0(self, tablet_commit_log0):
- self.tablet_commit_log0 = tablet_commit_log0
- return self
-
- def to_pb(self):
- st = _apis.ydb_table.StorageSettings()
- st.store_external_blobs = self.store_external_blobs
- if self.external:
- st.external.MergeFrom(self.external.to_pb())
- if self.tablet_commit_log0:
- st.tablet_commit_log0.MergeFrom(self.tablet_commit_log0.to_pb())
- if self.tablet_commit_log1:
- st.tablet_commit_log1.MergeFrom(self.tablet_commit_log1.to_pb())
- return st
-
-
-@enum.unique
-class Compression(enum.IntEnum):
- UNSPECIFIED = 0
- NONE = 1
- LZ4 = 2
-
-
-class ColumnFamily(object):
- def __init__(self):
- self.compression = 0
- self.name = None
- self.data = None
- self.keep_in_memory = 0
-
- def with_name(self, name):
- self.name = name
- return self
-
- def with_compression(self, compression):
- self.compression = compression
- return self
-
- def with_data(self, data):
- self.data = data
- return self
-
- def with_keep_in_memory(self, keep_in_memory):
- self.keep_in_memory = keep_in_memory
- return self
-
- def to_pb(self):
- cm = _apis.ydb_table.ColumnFamily()
- cm.keep_in_memory = self.keep_in_memory
- cm.compression = self.compression
- if self.name is not None:
- cm.name = self.name
- if self.data is not None:
- cm.data.MergeFrom(self.data.to_pb())
- return cm
-
-
-class TableDescription(object):
- def __init__(self):
- self.columns = []
- self.primary_key = []
- self.profile = None
- self.indexes = []
- self.column_families = []
- self.ttl_settings = None
- self.attributes = {}
- self.uniform_partitions = 0
- self.partition_at_keys = None
- self.compaction_policy = None
- self.key_bloom_filter = 0
- self.read_replicas_settings = None
- self.partitioning_settings = None
- self.storage_settings = None
-
- def with_storage_settings(self, storage_settings):
- self.storage_settings = storage_settings
- return self
-
- def with_column(self, column):
- self.columns.append(column)
- return self
-
- def with_columns(self, *columns):
- for column in columns:
- self.with_column(column)
- return self
-
- def with_primary_key(self, key):
- self.primary_key.append(key)
- return self
-
- def with_primary_keys(self, *keys):
- for pk in keys:
- self.with_primary_key(pk)
- return self
-
- def with_column_family(self, column_family):
- self.column_families.append(column_family)
- return self
-
- def with_column_families(self, *column_families):
- for column_family in column_families:
- self.with_column_family(column_family)
- return self
-
- def with_indexes(self, *indexes):
- for index in indexes:
- self.with_index(index)
- return self
-
- def with_index(self, index):
- self.indexes.append(index)
- return self
-
- def with_profile(self, profile):
- self.profile = profile
- return self
-
- def with_ttl(self, ttl_settings):
- self.ttl_settings = ttl_settings
- return self
-
- def with_attributes(self, attributes):
- self.attributes = attributes
- return self
-
- def with_uniform_partitions(self, uniform_partitions):
- self.uniform_partitions = uniform_partitions
- return self
-
- def with_partition_at_keys(self, partition_at_keys):
- self.partition_at_keys = partition_at_keys
- return self
-
- def with_key_bloom_filter(self, key_bloom_filter):
- self.key_bloom_filter = key_bloom_filter
- return self
-
- def with_partitioning_settings(self, partitioning_settings):
- self.partitioning_settings = partitioning_settings
- return self
-
- def with_read_replicas_settings(self, read_replicas_settings):
- self.read_replicas_settings = read_replicas_settings
- return self
-
- def with_compaction_policy(self, compaction_policy):
- self.compaction_policy = compaction_policy
- return self
-
-
-@six.add_metaclass(abc.ABCMeta)
-class AbstractTransactionModeBuilder(object):
- @property
- @abc.abstractmethod
- def name(self):
- pass
-
- @property
- @abc.abstractmethod
- def settings(self):
- pass
-
-
-class SnapshotReadOnly(AbstractTransactionModeBuilder):
- __slots__ = ("_pb", "_name")
-
- def __init__(self):
- self._pb = _apis.ydb_table.SnapshotModeSettings()
- self._name = "snapshot_read_only"
-
- @property
- def settings(self):
- return self._pb
-
- @property
- def name(self):
- return self._name
-
-
-class SerializableReadWrite(AbstractTransactionModeBuilder):
- __slots__ = ("_pb", "_name")
-
- def __init__(self):
- self._name = "serializable_read_write"
- self._pb = _apis.ydb_table.SerializableModeSettings()
-
- @property
- def settings(self):
- return self._pb
-
- @property
- def name(self):
- return self._name
-
-
-class OnlineReadOnly(AbstractTransactionModeBuilder):
- __slots__ = ("_pb", "_name")
-
- def __init__(self):
- self._pb = _apis.ydb_table.OnlineModeSettings()
- self._pb.allow_inconsistent_reads = False
- self._name = "online_read_only"
-
- def with_allow_inconsistent_reads(self):
- self._pb.allow_inconsistent_reads = True
- return self
-
- @property
- def settings(self):
- return self._pb
-
- @property
- def name(self):
- return self._name
-
-
-class StaleReadOnly(AbstractTransactionModeBuilder):
- __slots__ = ("_pb", "_name")
-
- def __init__(self):
- self._pb = _apis.ydb_table.StaleModeSettings()
- self._name = "stale_read_only"
-
- @property
- def settings(self):
- return self._pb
-
- @property
- def name(self):
- return self._name
-
-
-class BackoffSettings(object):
- def __init__(self, ceiling=6, slot_duration=0.001, uncertain_ratio=0.5):
- self.ceiling = ceiling
- self.slot_duration = slot_duration
- self.uncertain_ratio = uncertain_ratio
-
- def calc_timeout(self, retry_number):
- slots_count = 1 << min(retry_number, self.ceiling)
- max_duration_ms = slots_count * self.slot_duration * 1000.0
- # duration_ms = random.random() * max_duration_ms * uncertain_ratio) + max_duration_ms * (1 - uncertain_ratio)
- duration_ms = max_duration_ms * (
- random.random() * self.uncertain_ratio + 1.0 - self.uncertain_ratio
- )
- return duration_ms / 1000.0
-
-
-class RetrySettings(object):
- def __init__(
- self,
- max_retries=10,
- max_session_acquire_timeout=None,
- on_ydb_error_callback=None,
- backoff_ceiling=6,
- backoff_slot_duration=1,
- get_session_client_timeout=5,
- fast_backoff_settings=None,
- slow_backoff_settings=None,
- idempotent=False,
- ):
- self.max_retries = max_retries
- self.max_session_acquire_timeout = max_session_acquire_timeout
- self.on_ydb_error_callback = (
- (lambda e: None) if on_ydb_error_callback is None else on_ydb_error_callback
- )
- self.fast_backoff = (
- BackoffSettings(10, 0.005)
- if fast_backoff_settings is None
- else fast_backoff_settings
- )
- self.slow_backoff = (
- BackoffSettings(backoff_ceiling, backoff_slot_duration)
- if slow_backoff_settings is None
- else slow_backoff_settings
- )
- self.retry_not_found = True
- self.idempotent = idempotent
- self.retry_internal_error = True
- self.unknown_error_handler = lambda e: None
- self.get_session_client_timeout = get_session_client_timeout
- if max_session_acquire_timeout is not None:
- self.get_session_client_timeout = min(
- self.max_session_acquire_timeout, self.get_session_client_timeout
- )
-
- def with_fast_backoff(self, backoff_settings):
- self.fast_backoff = backoff_settings
- return self
-
- def with_slow_backoff(self, backoff_settings):
- self.slow_backoff = backoff_settings
- return self
-
-
-class YdbRetryOperationSleepOpt(object):
- def __init__(self, timeout):
- self.timeout = timeout
-
- def __eq__(self, other):
- return type(self) == type(other) and self.timeout == other.timeout
-
- def __repr__(self):
- return "YdbRetryOperationSleepOpt(%s)" % self.timeout
-
-
-class YdbRetryOperationFinalResult(object):
- def __init__(self, result):
- self.result = result
- self.exc = None
-
- def __eq__(self, other):
- return (
- type(self) == type(other)
- and self.result == other.result
- and self.exc == other.exc
- )
-
- def __repr__(self):
- return "YdbRetryOperationFinalResult(%s, exc=%s)" % (self.result, self.exc)
-
- def set_exception(self, exc):
- self.exc = exc
-
-
-def retry_operation_impl(callee, retry_settings=None, *args, **kwargs):
- retry_settings = RetrySettings() if retry_settings is None else retry_settings
- status = None
-
- for attempt in six.moves.range(retry_settings.max_retries + 1):
- try:
- result = YdbRetryOperationFinalResult(callee(*args, **kwargs))
- yield result
-
- if result.exc is not None:
- raise result.exc
-
- except issues.Error as e:
- status = e
- retry_settings.on_ydb_error_callback(e)
-
- retriable_info = check_retriable_error(e, retry_settings, attempt)
- if not retriable_info.is_retriable:
- raise
-
- skip_yield_error_types = [
- issues.Aborted,
- issues.BadSession,
- issues.NotFound,
- issues.InternalError,
- ]
-
- yield_sleep = True
- for t in skip_yield_error_types:
- if isinstance(e, t):
- yield_sleep = False
-
- if yield_sleep:
- yield YdbRetryOperationSleepOpt(retriable_info.sleep_timeout_seconds)
-
- except Exception as e:
- # you should provide your own handler you want
- retry_settings.unknown_error_handler(e)
- raise
-
- raise status
-
-
-def retry_operation_sync(callee, retry_settings=None, *args, **kwargs):
- opt_generator = retry_operation_impl(callee, retry_settings, *args, **kwargs)
- for next_opt in opt_generator:
- if isinstance(next_opt, YdbRetryOperationSleepOpt):
- time.sleep(next_opt.timeout)
- else:
- return next_opt.result
-
-
-class TableClientSettings(object):
- def __init__(self):
- self._client_query_cache_enabled = False
- self._native_datetime_in_result_sets = False
- self._native_date_in_result_sets = False
- self._make_result_sets_lazy = False
- self._native_json_in_result_sets = False
- self._native_interval_in_result_sets = False
- self._native_timestamp_in_result_sets = False
- self._allow_truncated_result = convert._default_allow_truncated_result
-
- def with_native_timestamp_in_result_sets(self, enabled):
- # type:(bool) -> ydb.TableClientSettings
- self._native_timestamp_in_result_sets = enabled
- return self
-
- def with_native_interval_in_result_sets(self, enabled):
- # type:(bool) -> ydb.TableClientSettings
- self._native_interval_in_result_sets = enabled
- return self
-
- def with_native_json_in_result_sets(self, enabled):
- # type:(bool) -> ydb.TableClientSettings
- self._native_json_in_result_sets = enabled
- return self
-
- def with_native_date_in_result_sets(self, enabled):
- # type:(bool) -> ydb.TableClientSettings
- self._native_date_in_result_sets = enabled
- return self
-
- def with_native_datetime_in_result_sets(self, enabled):
- # type:(bool) -> ydb.TableClientSettings
- self._native_datetime_in_result_sets = enabled
- return self
-
- def with_client_query_cache(self, enabled):
- # type:(bool) -> ydb.TableClientSettings
- self._client_query_cache_enabled = enabled
- return self
-
- def with_lazy_result_sets(self, enabled):
- # type:(bool) -> ydb.TableClientSettings
- self._make_result_sets_lazy = enabled
- return self
-
- def with_allow_truncated_result(self, enabled):
- # type:(bool) -> ydb.TableClientSettings
- self._allow_truncated_result = enabled
- return self
-
-
-class ScanQueryResult(object):
- def __init__(self, result, table_client_settings):
- self._result = result
- self.query_stats = result.query_stats
- self.result_set = convert.ResultSet.from_message(
- self._result.result_set, table_client_settings
- )
-
-
-@enum.unique
-class QueryStatsCollectionMode(enum.IntEnum):
- NONE = _apis.ydb_table.QueryStatsCollection.Mode.STATS_COLLECTION_NONE
- BASIC = _apis.ydb_table.QueryStatsCollection.Mode.STATS_COLLECTION_BASIC
- FULL = _apis.ydb_table.QueryStatsCollection.Mode.STATS_COLLECTION_FULL
-
-
-class ScanQuerySettings(settings_impl.BaseRequestSettings):
- def __init__(self):
- super(ScanQuerySettings, self).__init__()
- self.collect_stats = None
-
- def with_collect_stats(self, collect_stats_mode):
- self.collect_stats = collect_stats_mode
- return self
-
-
-class ScanQuery(object):
- def __init__(self, yql_text, parameters_types):
- self.yql_text = yql_text
- self.parameters_types = parameters_types
-
-
-def _wrap_scan_query_response(response, table_client_settings):
- issues._process_response(response)
- return ScanQueryResult(response.result, table_client_settings)
-
-
-def _scan_query_request_factory(query, parameters=None, settings=None):
- if not isinstance(query, ScanQuery):
- query = ScanQuery(query, {})
- parameters = {} if parameters is None else parameters
- collect_stats = getattr(
- settings,
- "collect_stats",
- _apis.ydb_table.QueryStatsCollection.Mode.STATS_COLLECTION_NONE,
- )
- return _apis.ydb_table.ExecuteScanQueryRequest(
- mode=_apis.ydb_table.ExecuteScanQueryRequest.Mode.MODE_EXEC,
- query=_apis.ydb_table.Query(yql_text=query.yql_text),
- parameters=convert.parameters_to_pb(query.parameters_types, parameters),
- collect_stats=collect_stats,
- )
-
-
-@six.add_metaclass(abc.ABCMeta)
-class ISession:
- @abstractmethod
- def __init__(self, driver, table_client_settings):
- pass
-
- @abstractmethod
- def __lt__(self, other):
- pass
-
- @abstractmethod
- def __eq__(self, other):
- pass
-
- @property
- @abstractmethod
- def session_id(self):
- pass
-
- @abstractmethod
- def initialized(self):
- """
- Return True if session is successfully initialized with a session_id and False otherwise.
- """
- pass
-
- @abstractmethod
- def pending_query(self):
- pass
-
- @abstractmethod
- def reset(self):
- """
- Perform session state reset (that includes cleanup of the session_id, query cache, and etc.)
- """
- pass
-
- @abstractmethod
- def read_table(
- self,
- path,
- key_range=None,
- columns=(),
- ordered=False,
- row_limit=None,
- settings=None,
- use_snapshot=None,
- ):
- """
- Perform an read table request.
-
- :param path: A path to the table
- :param key_range: (optional) A KeyRange instance that describes a range to read. The KeyRange instance\
- should include from_bound and/or to_bound. Each of the bounds (if provided) should specify a value of the\
- key bound, and type of the key prefix. See an example above.
- :param columns: (optional) An iterable with table columns to read.
- :param ordered: (optional) A flag that indicates that result should be ordered.
- :param row_limit: (optional) A number of rows to read.
- :param settings: Request settings
-
- :return: SyncResponseIterator instance
- """
- pass
-
- @abstractmethod
- def keep_alive(self, settings=None):
- pass
-
- @abstractmethod
- def create(self, settings=None):
- pass
-
- @abstractmethod
- def delete(self, settings=None):
- pass
-
- @abstractmethod
- def execute_scheme(self, yql_text, settings=None):
- pass
-
- @abstractmethod
- def transaction(
- self, tx_mode=None, allow_split_transactions=_allow_split_transaction
- ):
- pass
-
- @abstractmethod
- def has_prepared(self, query):
- pass
-
- @abstractmethod
- def prepare(self, query, settings=None):
- pass
-
- @abstractmethod
- def explain(self, yql_text, settings=None):
- """
- Expiremental API.
-
- :param yql_text:
- :param settings:
-
- :return:
- """
- pass
-
- @abstractmethod
- def create_table(self, path, table_description, settings=None):
- """
- Create a YDB table.
-
- :param path: A table path
- :param table_description: A description of table to create. An instance TableDescription
- :param settings: An instance of BaseRequestSettings that describes how rpc should invoked.
-
- :return: A description of created scheme entry or error otherwise.
- """
- pass
-
- @abstractmethod
- def drop_table(self, path, settings=None):
- pass
-
- @abstractmethod
- def alter_table(
- self,
- path,
- add_columns=None,
- drop_columns=None,
- settings=None,
- alter_attributes=None,
- add_indexes=None,
- drop_indexes=None,
- set_ttl_settings=None,
- drop_ttl_settings=None,
- add_column_families=None,
- alter_column_families=None,
- alter_storage_settings=None,
- set_compaction_policy=None,
- alter_partitioning_settings=None,
- set_key_bloom_filter=None,
- set_read_replicas_settings=None,
- ):
- pass
-
- @abstractmethod
- def copy_table(self, source_path, destination_path, settings=None):
- pass
-
- @abstractmethod
- def copy_tables(self, source_destination_pairs, settings=None):
- pass
-
- def describe_table(self, path, settings=None):
- """
- Returns a description of the table by provided path
-
- :param path: A table path
- :param settings: A request settings
-
- :return: Description of a table
- """
- pass
-
-
-@six.add_metaclass(abc.ABCMeta)
-class ITableClient:
- def __init__(self, driver, table_client_settings=None):
- pass
-
- @abstractmethod
- def session(self):
- pass
-
- @abstractmethod
- def scan_query(self, query, parameters=None, settings=None):
- pass
-
- @abstractmethod
- def bulk_upsert(self, table_path, rows, column_types, settings=None):
- """
- Bulk upsert data
-
- :param table_path: A table path.
- :param rows: A list of structures.
- :param column_types: Bulk upsert column types.
-
- """
- pass
-
-
-class BaseTableClient(ITableClient):
- def __init__(self, driver, table_client_settings=None):
- # type:(ydb.Driver, ydb.TableClientSettings) -> None
- self._driver = driver
- self._table_client_settings = (
- TableClientSettings()
- if table_client_settings is None
- else table_client_settings
- )
-
- def session(self):
- # type: () -> ydb.Session
- return Session(self._driver, self._table_client_settings)
-
- def scan_query(self, query, parameters=None, settings=None):
- # type: (ydb.ScanQuery, tuple, ydb.BaseRequestSettings) -> ydb.SyncResponseIterator
- request = _scan_query_request_factory(query, parameters, settings)
- stream_it = self._driver(
- request,
- _apis.TableService.Stub,
- _apis.TableService.StreamExecuteScanQuery,
- settings=settings,
- )
- return _utilities.SyncResponseIterator(
- stream_it,
- lambda resp: _wrap_scan_query_response(resp, self._table_client_settings),
- )
-
- def bulk_upsert(self, table_path, rows, column_types, settings=None):
- # type: (str, list, ydb.AbstractTypeBuilder | ydb.PrimitiveType, ydb.BaseRequestSettings) -> None
- """
- Bulk upsert data
-
- :param table_path: A table path.
- :param rows: A list of structures.
- :param column_types: Bulk upsert column types.
-
- """
- return self._driver(
- _session_impl.bulk_upsert_request_factory(table_path, rows, column_types),
- _apis.TableService.Stub,
- _apis.TableService.BulkUpsert,
- _session_impl.wrap_operation_bulk_upsert,
- settings,
- (),
- )
-
-
-class TableClient(BaseTableClient):
- def async_scan_query(self, query, parameters=None, settings=None):
- # type: (ydb.ScanQuery, tuple, ydb.BaseRequestSettings) -> ydb.AsyncResponseIterator
- request = _scan_query_request_factory(query, parameters, settings)
- stream_it = self._driver(
- request,
- _apis.TableService.Stub,
- _apis.TableService.StreamExecuteScanQuery,
- settings=settings,
- )
- return _utilities.AsyncResponseIterator(
- stream_it,
- lambda resp: _wrap_scan_query_response(resp, self._table_client_settings),
- )
-
- @_utilities.wrap_async_call_exceptions
- def async_bulk_upsert(self, table_path, rows, column_types, settings=None):
- # type: (str, list, ydb.AbstractTypeBuilder | ydb.PrimitiveType, ydb.BaseRequestSettings) -> None
- return self._driver.future(
- _session_impl.bulk_upsert_request_factory(table_path, rows, column_types),
- _apis.TableService.Stub,
- _apis.TableService.BulkUpsert,
- _session_impl.wrap_operation_bulk_upsert,
- settings,
- (),
- )
-
-
-def _make_index_description(index):
- result = TableIndex(index.name).with_index_columns(
- *tuple(col for col in index.index_columns)
- )
- result.status = IndexStatus(index.status)
- return result
-
-
-class TableSchemeEntry(scheme.SchemeEntry):
- def __init__(
- self,
- name,
- owner,
- type,
- effective_permissions,
- permissions,
- size_bytes,
- columns,
- primary_key,
- shard_key_bounds,
- indexes,
- table_stats,
- ttl_settings,
- attributes,
- partitioning_settings,
- column_families,
- key_bloom_filter,
- read_replicas_settings,
- storage_settings,
- *args,
- **kwargs
- ):
-
- super(TableSchemeEntry, self).__init__(
- name,
- owner,
- type,
- effective_permissions,
- permissions,
- size_bytes,
- *args,
- **kwargs
- )
- self.primary_key = [pk for pk in primary_key]
- self.columns = [
- Column(column.name, convert.type_to_native(column.type), column.family)
- for column in columns
- ]
- self.indexes = [_make_index_description(index) for index in indexes]
- self.shard_key_ranges = []
- self.column_families = []
- self.key_bloom_filter = FeatureFlag(key_bloom_filter)
- left_key_bound = None
- for column_family in column_families:
- self.column_families.append(
- ColumnFamily()
- .with_name(column_family.name)
- .with_keep_in_memory(FeatureFlag(column_family.keep_in_memory))
- .with_compression(Compression(column_family.compression))
- )
-
- if column_family.HasField("data"):
- self.column_families[-1].with_data(
- StoragePool(column_family.data.media)
- )
-
- for shard_key_bound in shard_key_bounds:
- # for next key range
- key_bound_type = shard_key_bound.type
- current_bound = convert.to_native_value(shard_key_bound)
- self.shard_key_ranges.append(
- KeyRange(
- None
- if left_key_bound is None
- else KeyBound.inclusive(left_key_bound, key_bound_type),
- KeyBound.exclusive(current_bound, key_bound_type),
- )
- )
- left_key_bound = current_bound
-
- assert isinstance(left_key_bound, tuple)
-
- if len(shard_key_bounds) > 0:
- self.shard_key_ranges.append(
- KeyRange(
- KeyBound.inclusive(left_key_bound, shard_key_bounds[-1].type),
- None,
- )
- )
-
- else:
- self.shard_key_ranges.append(KeyRange(None, None))
-
- self.read_replicas_settings = None
- if read_replicas_settings is not None:
- self.read_replicas_settings = ReadReplicasSettings()
- for field in ("per_az_read_replicas_count", "any_az_read_replicas_count"):
- if read_replicas_settings.WhichOneof("settings") == field:
- setattr(
- self.read_replicas_settings,
- field,
- getattr(read_replicas_settings, field),
- )
-
- self.storage_settings = None
- if storage_settings is not None:
- self.storage_settings = StorageSettings()
- self.storage_settings.store_external_blobs = FeatureFlag(
- self.storage_settings.store_external_blobs
- )
- if storage_settings.HasField("tablet_commit_log0"):
- self.storage_settings.with_tablet_commit_log0(
- StoragePool(storage_settings.tablet_commit_log0.media)
- )
-
- if storage_settings.HasField("tablet_commit_log1"):
- self.storage_settings.with_tablet_commit_log1(
- StoragePool(storage_settings.tablet_commit_log1.media)
- )
-
- if storage_settings.HasField("external"):
- self.storage_settings.with_external(
- StoragePool(storage_settings.external.media)
- )
-
- self.partitioning_settings = None
- if partitioning_settings is not None:
- self.partitioning_settings = PartitioningSettings()
- for field in (
- "partitioning_by_size",
- "partitioning_by_load",
- "partition_size_mb",
- "min_partitions_count",
- "max_partitions_count",
- ):
- setattr(
- self.partitioning_settings,
- field,
- getattr(partitioning_settings, field),
- )
-
- self.ttl_settings = None
- if ttl_settings is not None:
- if ttl_settings.HasField("date_type_column"):
- self.ttl_settings = TtlSettings().with_date_type_column(
- ttl_settings.date_type_column.column_name,
- ttl_settings.date_type_column.expire_after_seconds,
- )
- elif ttl_settings.HasField("value_since_unix_epoch"):
- self.ttl_settings = TtlSettings().with_value_since_unix_epoch(
- ttl_settings.value_since_unix_epoch.column_name,
- ColumnUnit(ttl_settings.value_since_unix_epoch.column_unit),
- ttl_settings.value_since_unix_epoch.expire_after_seconds,
- )
-
- self.table_stats = None
- if table_stats is not None:
- self.table_stats = TableStats()
- if table_stats.partitions != 0:
- self.table_stats = self.table_stats.with_partitions(
- table_stats.partitions
- )
-
- if table_stats.store_size != 0:
- self.table_stats = self.table_stats.with_store_size(
- table_stats.store_size
- )
-
- self.attributes = attributes
-
-
-class RenameItem:
- def __init__(self, source_path, destination_path, replace_destination=False):
- self._source_path = source_path
- self._destination_path = destination_path
- self._replace_destination = replace_destination
-
- @property
- def source_path(self):
- return self._source_path
-
- @property
- def destination_path(self):
- return self._destination_path
-
- @property
- def replace_destination(self):
- return self._replace_destination
-
-
-class BaseSession(ISession):
- def __init__(self, driver, table_client_settings):
- self._driver = driver
- self._state = _session_impl.SessionState(table_client_settings)
-
- def __lt__(self, other):
- return self.session_id < other.session_id
-
- def __eq__(self, other):
- return self.session_id == other.session_id
-
- @property
- def session_id(self):
- """
- Return session_id.
- """
- return self._state.session_id
-
- def initialized(self):
- """
- Return True if session is successfully initialized with a session_id and False otherwise.
- """
- return self._state.session_id is not None
-
- def pending_query(self):
- return self._state.pending_query()
-
- def closing(self):
- """Returns True if session is closing."""
- return self._state.closing()
-
- def reset(self):
- """
- Perform session state reset (that includes cleanup of the session_id, query cache, and etc.)
- """
- return self._state.reset()
-
- def read_table(
- self,
- path,
- key_range=None,
- columns=(),
- ordered=False,
- row_limit=None,
- settings=None,
- use_snapshot=None,
- ):
- """
- Perform an read table request.
-
- :param path: A path to the table
- :param key_range: (optional) A KeyRange instance that describes a range to read. The KeyRange instance\
- should include from_bound and/or to_bound. Each of the bounds (if provided) should specify a value of the\
- key bound, and type of the key prefix. See an example above.
- :param columns: (optional) An iterable with table columns to read.
- :param ordered: (optional) A flag that indicates that result should be ordered.
- :param row_limit: (optional) A number of rows to read.
-
- :return: SyncResponseIterator instance
- """
- request = _session_impl.read_table_request_factory(
- self._state,
- path,
- key_range,
- columns,
- ordered,
- row_limit,
- use_snapshot=use_snapshot,
- )
- stream_it = self._driver(
- request,
- _apis.TableService.Stub,
- _apis.TableService.StreamReadTable,
- settings=settings,
- )
- return _utilities.SyncResponseIterator(
- stream_it, _session_impl.wrap_read_table_response
- )
-
- def keep_alive(self, settings=None):
- return self._driver(
- _session_impl.keep_alive_request_factory(self._state),
- _apis.TableService.Stub,
- _apis.TableService.KeepAlive,
- _session_impl.wrap_keep_alive_response,
- settings,
- (self._state, self),
- self._state.endpoint,
- )
-
- def create(self, settings=None):
- if self._state.session_id is not None:
- return self
- create_settings = settings_impl.BaseRequestSettings()
- if settings is not None:
- create_settings = settings.make_copy()
- create_settings = create_settings.with_header(
- "x-ydb-client-capabilities", "session-balancer"
- )
- return self._driver(
- _apis.ydb_table.CreateSessionRequest(),
- _apis.TableService.Stub,
- _apis.TableService.CreateSession,
- _session_impl.initialize_session,
- create_settings,
- (self._state, self),
- self._state.endpoint,
- )
-
- def delete(self, settings=None):
- return self._driver(
- self._state.attach_request(_apis.ydb_table.DeleteSessionRequest()),
- _apis.TableService.Stub,
- _apis.TableService.DeleteSession,
- _session_impl.cleanup_session,
- settings,
- (self._state, self),
- self._state.endpoint,
- )
-
- def execute_scheme(self, yql_text, settings=None):
- return self._driver(
- _session_impl.execute_scheme_request_factory(self._state, yql_text),
- _apis.TableService.Stub,
- _apis.TableService.ExecuteSchemeQuery,
- _session_impl.wrap_execute_scheme_result,
- settings,
- (self._state,),
- self._state.endpoint,
- )
-
- def transaction(
- self, tx_mode=None, allow_split_transactions=_allow_split_transaction
- ):
- return TxContext(
- self._driver,
- self._state,
- self,
- tx_mode,
- allow_split_transactions=allow_split_transactions,
- )
-
- def has_prepared(self, query):
- return query in self._state
-
- def prepare(self, query, settings=None):
- data_query, _ = self._state.lookup(query)
- if data_query is not None:
- return data_query
- return self._driver(
- _session_impl.prepare_request_factory(self._state, query),
- _apis.TableService.Stub,
- _apis.TableService.PrepareDataQuery,
- _session_impl.wrap_prepare_query_response,
- settings,
- (self._state, query),
- self._state.endpoint,
- )
-
- def explain(self, yql_text, settings=None):
- """
- Expiremental API.
-
- :param yql_text:
- :param settings:
-
- :return:
- """
- return self._driver(
- _session_impl.explain_data_query_request_factory(self._state, yql_text),
- _apis.TableService.Stub,
- _apis.TableService.ExplainDataQuery,
- _session_impl.wrap_explain_response,
- settings,
- (self._state,),
- self._state.endpoint,
- )
-
- def create_table(self, path, table_description, settings=None):
- """
- Create a YDB table.
-
- :param path: A table path
- :param table_description: A description of table to create. An instance TableDescription
- :param settings: An instance of BaseRequestSettings that describes how rpc should invoked.
-
- :return: A description of created scheme entry or error otherwise.
- """
- return self._driver(
- _session_impl.create_table_request_factory(
- self._state, path, table_description
- ),
- _apis.TableService.Stub,
- _apis.TableService.CreateTable,
- _session_impl.wrap_operation,
- settings,
- (self._driver,),
- self._state.endpoint,
- )
-
- def drop_table(self, path, settings=None):
- return self._driver(
- self._state.attach_request(_apis.ydb_table.DropTableRequest(path=path)),
- _apis.TableService.Stub,
- _apis.TableService.DropTable,
- _session_impl.wrap_operation,
- settings,
- (self._state,),
- self._state.endpoint,
- )
-
- def alter_table(
- self,
- path,
- add_columns=None,
- drop_columns=None,
- settings=None,
- alter_attributes=None,
- add_indexes=None,
- drop_indexes=None,
- set_ttl_settings=None,
- drop_ttl_settings=None,
- add_column_families=None,
- alter_column_families=None,
- alter_storage_settings=None,
- set_compaction_policy=None,
- alter_partitioning_settings=None,
- set_key_bloom_filter=None,
- set_read_replicas_settings=None,
- ):
- return self._driver(
- _session_impl.alter_table_request_factory(
- self._state,
- path,
- add_columns,
- drop_columns,
- alter_attributes,
- add_indexes,
- drop_indexes,
- set_ttl_settings,
- drop_ttl_settings,
- add_column_families,
- alter_column_families,
- alter_storage_settings,
- set_compaction_policy,
- alter_partitioning_settings,
- set_key_bloom_filter,
- set_read_replicas_settings,
- ),
- _apis.TableService.Stub,
- _apis.TableService.AlterTable,
- _session_impl.AlterTableOperation,
- settings,
- (self._driver,),
- self._state.endpoint,
- )
-
- def describe_table(self, path, settings=None):
- """
- Returns a description of the table by provided path
-
- :param path: A table path
- :param settings: A request settings
-
- :return: Description of a table
- """
- return self._driver(
- _session_impl.describe_table_request_factory(self._state, path, settings),
- _apis.TableService.Stub,
- _apis.TableService.DescribeTable,
- _session_impl.wrap_describe_table_response,
- settings,
- (self._state, TableSchemeEntry),
- self._state.endpoint,
- )
-
- def copy_table(self, source_path, destination_path, settings=None):
- return self.copy_tables([(source_path, destination_path)], settings=settings)
-
- def copy_tables(self, source_destination_pairs, settings=None):
- return self._driver(
- _session_impl.copy_tables_request_factory(
- self._state, source_destination_pairs
- ),
- _apis.TableService.Stub,
- _apis.TableService.CopyTables,
- _session_impl.wrap_operation,
- settings,
- (self._state,),
- self._state.endpoint,
- )
-
- def rename_tables(self, rename_items, settings=None):
- return self._driver(
- _session_impl.rename_tables_request_factory(self._state, rename_items),
- _apis.TableService.Stub,
- _apis.TableService.RenameTables,
- _session_impl.wrap_operation,
- settings,
- (self._state,),
- self._state.endpoint,
- )
-
-
-class Session(BaseSession):
- def async_read_table(
- self,
- path,
- key_range=None,
- columns=(),
- ordered=False,
- row_limit=None,
- settings=None,
- use_snapshot=None,
- ):
- """
- Perform an read table request.
-
- :param path: A path to the table
- :param key_range: (optional) A KeyRange instance that describes a range to read. The KeyRange instance\
- should include from_bound and/or to_bound. Each of the bounds (if provided) should specify a value of the\
- key bound, and type of the key prefix. See an example above.
- :param columns: (optional) An iterable with table columns to read.
- :param ordered: (optional) A flag that indicates that result should be ordered.
- :param row_limit: (optional) A number of rows to read.
-
- :return: AsyncResponseIterator instance
- """
- if interceptor is None:
- raise RuntimeError("Async read table is not available due to import issues")
- request = _session_impl.read_table_request_factory(
- self._state,
- path,
- key_range,
- columns,
- ordered,
- row_limit,
- use_snapshot=use_snapshot,
- )
- stream_it = self._driver(
- request,
- _apis.TableService.Stub,
- _apis.TableService.StreamReadTable,
- settings=settings,
- )
- return _utilities.AsyncResponseIterator(
- stream_it, _session_impl.wrap_read_table_response
- )
-
- @_utilities.wrap_async_call_exceptions
- def async_keep_alive(self, settings=None):
- return self._driver.future(
- _session_impl.keep_alive_request_factory(self._state),
- _apis.TableService.Stub,
- _apis.TableService.KeepAlive,
- _session_impl.wrap_keep_alive_response,
- settings,
- (self._state, self),
- self._state.endpoint,
- )
-
- @_utilities.wrap_async_call_exceptions
- def async_create(self, settings=None):
- if self._state.session_id is not None:
- return _utilities.wrap_result_in_future(self)
- create_settings = settings_impl.BaseRequestSettings()
- if settings is not None:
- create_settings = settings.make_copy()
- create_settings = create_settings.with_header(
- "x-ydb-client-capabilities", "session-balancer"
- )
- return self._driver.future(
- _apis.ydb_table.CreateSessionRequest(),
- _apis.TableService.Stub,
- _apis.TableService.CreateSession,
- _session_impl.initialize_session,
- create_settings,
- (self._state, self),
- self._state.endpoint,
- )
-
- @_utilities.wrap_async_call_exceptions
- def async_delete(self, settings=None):
- return self._driver.future(
- self._state.attach_request(_apis.ydb_table.DeleteSessionRequest()),
- _apis.TableService.Stub,
- _apis.TableService.DeleteSession,
- _session_impl.cleanup_session,
- settings,
- (self._state, self),
- self._state.endpoint,
- )
-
- @_utilities.wrap_async_call_exceptions
- def async_execute_scheme(self, yql_text, settings=None):
- return self._driver.future(
- _session_impl.execute_scheme_request_factory(self._state, yql_text),
- _apis.TableService.Stub,
- _apis.TableService.ExecuteSchemeQuery,
- _session_impl.wrap_execute_scheme_result,
- settings,
- (self._state,),
- self._state.endpoint,
- )
-
- @_utilities.wrap_async_call_exceptions
- def async_prepare(self, query, settings=None):
- data_query, _ = self._state.lookup(query)
- if data_query is not None:
- return _utilities.wrap_result_in_future(data_query)
- return self._driver.future(
- _session_impl.prepare_request_factory(self._state, query),
- _apis.TableService.Stub,
- _apis.TableService.PrepareDataQuery,
- _session_impl.wrap_prepare_query_response,
- settings,
- (
- self._state,
- query,
- ),
- self._state.endpoint,
- )
-
- @_utilities.wrap_async_call_exceptions
- def async_create_table(self, path, table_description, settings=None):
- return self._driver.future(
- _session_impl.create_table_request_factory(
- self._state, path, table_description
- ),
- _apis.TableService.Stub,
- _apis.TableService.CreateTable,
- _session_impl.wrap_operation,
- settings,
- (self._driver,),
- self._state.endpoint,
- )
-
- @_utilities.wrap_async_call_exceptions
- def async_drop_table(self, path, settings=None):
- return self._driver.future(
- self._state.attach_request(_apis.ydb_table.DropTableRequest(path=path)),
- _apis.TableService.Stub,
- _apis.TableService.DropTable,
- _session_impl.wrap_operation,
- settings,
- (self._state,),
- self._state.endpoint,
- )
-
- @_utilities.wrap_async_call_exceptions
- def async_alter_table(
- self,
- path,
- add_columns=None,
- drop_columns=None,
- settings=None,
- alter_attributes=None,
- add_indexes=None,
- drop_indexes=None,
- set_ttl_settings=None,
- drop_ttl_settings=None,
- add_column_families=None,
- alter_column_families=None,
- alter_storage_settings=None,
- set_compaction_policy=None,
- alter_partitioning_settings=None,
- set_key_bloom_filter=None,
- set_read_replicas_settings=None,
- ):
- return self._driver.future(
- _session_impl.alter_table_request_factory(
- self._state,
- path,
- add_columns,
- drop_columns,
- alter_attributes,
- add_indexes,
- drop_indexes,
- set_ttl_settings,
- drop_ttl_settings,
- add_column_families,
- alter_column_families,
- alter_storage_settings,
- set_compaction_policy,
- alter_partitioning_settings,
- set_key_bloom_filter,
- set_read_replicas_settings,
- ),
- _apis.TableService.Stub,
- _apis.TableService.AlterTable,
- _session_impl.AlterTableOperation,
- settings,
- (self._driver,),
- self._state.endpoint,
- )
-
- def async_copy_table(self, source_path, destination_path, settings=None):
- return self.async_copy_tables(
- [(source_path, destination_path)], settings=settings
- )
-
- @_utilities.wrap_async_call_exceptions
- def async_copy_tables(self, source_destination_pairs, settings=None):
- return self._driver.future(
- _session_impl.copy_tables_request_factory(
- self._state, source_destination_pairs
- ),
- _apis.TableService.Stub,
- _apis.TableService.CopyTables,
- _session_impl.wrap_operation,
- settings,
- (self._state,),
- self._state.endpoint,
- )
-
- @_utilities.wrap_async_call_exceptions
- def async_rename_tables(self, rename_tables, settings=None):
- return self._driver.future(
- _session_impl.rename_tables_request_factory(self._state, rename_tables),
- _apis.TableService.Stub,
- _apis.TableService.RenameTables,
- _session_impl.wrap_operation,
- settings,
- (self._state,),
- self._state.endpoint,
- )
-
- @_utilities.wrap_async_call_exceptions
- def async_describe_table(self, path, settings=None):
- return self._driver.future(
- _session_impl.describe_table_request_factory(self._state, path, settings),
- _apis.TableService.Stub,
- _apis.TableService.DescribeTable,
- _session_impl.wrap_describe_table_response,
- settings,
- (self._state, TableSchemeEntry),
- self._state.endpoint,
- )
-
-
-@six.add_metaclass(abc.ABCMeta)
-class ITxContext:
- @abstractmethod
- def __init__(self, driver, session_state, session, tx_mode=None):
- """
- An object that provides a simple transaction context manager that allows statements execution
- in a transaction. You don't have to open transaction explicitly, because context manager encapsulates
- transaction control logic, and opens new transaction if:
- 1) By explicit .begin();
- 2) On execution of a first statement, which is strictly recommended method, because that avoids
- useless round trip
-
- This context manager is not thread-safe, so you should not manipulate on it concurrently.
-
- :param driver: A driver instance
- :param session_state: A state of session
- :param tx_mode: A transaction mode, which is a one from the following choices:
- 1) SerializableReadWrite() which is default mode;
- 2) OnlineReadOnly();
- 3) StaleReadOnly().
- """
- pass
-
- @abstractmethod
- def __enter__(self):
- """
- Enters a context manager and returns a session
-
- :return: A session instance
- """
- pass
-
- @abstractmethod
- def __exit__(self, *args, **kwargs):
- """
- Closes a transaction context manager and rollbacks transaction if
- it is not rolled back explicitly
- """
- pass
-
- @property
- @abstractmethod
- def session_id(self):
- """
- A transaction's session id
-
- :return: A transaction's session id
- """
- pass
-
- @property
- @abstractmethod
- def tx_id(self):
- """
- Returns a id of open transaction or None otherwise
-
- :return: A id of open transaction or None otherwise
- """
- pass
-
- @abstractmethod
- def execute(self, query, parameters=None, commit_tx=False, settings=None):
- """
- Sends a query (yql text or an instance of DataQuery) to be executed with parameters.
- Execution with parameters supported only for DataQuery instances and is not supported yql text queries.
-
- :param query: A query, yql text or DataQuery instance.
- :param parameters: A dictionary with parameters values.
- :param commit_tx: A special flag that allows transaction commit
- :param settings: An additional request settings
-
- :return: A result sets or exception in case of execution errors
- """
- pass
-
- @abstractmethod
- def commit(self, settings=None):
- """
- Calls commit on a transaction if it is open otherwise is no-op. If transaction execution
- failed then this method raises PreconditionFailed.
-
- :param settings: A request settings
-
- :return: A committed transaction or exception if commit is failed
- """
- pass
-
- @abstractmethod
- def rollback(self, settings=None):
- """
- Calls rollback on a transaction if it is open otherwise is no-op. If transaction execution
- failed then this method raises PreconditionFailed.
-
- :param settings: A request settings
-
- :return: A rolled back transaction or exception if rollback is failed
- """
- pass
-
- @abstractmethod
- def begin(self, settings=None):
- """
- Explicitly begins a transaction
-
- :param settings: A request settings
-
- :return: An open transaction
- """
- pass
-
-
-class BaseTxContext(ITxContext):
- __slots__ = (
- "_tx_state",
- "_session_state",
- "_driver",
- "session",
- "_finished",
- "_allow_split_transactions",
- )
-
- _COMMIT = "commit"
- _ROLLBACK = "rollback"
-
- def __init__(
- self,
- driver,
- session_state,
- session,
- tx_mode=None,
- allow_split_transactions=_allow_split_transaction,
- ):
- """
- An object that provides a simple transaction context manager that allows statements execution
- in a transaction. You don't have to open transaction explicitly, because context manager encapsulates
- transaction control logic, and opens new transaction if:
-
- 1) By explicit .begin() and .async_begin() methods;
- 2) On execution of a first statement, which is strictly recommended method, because that avoids useless round trip
-
- This context manager is not thread-safe, so you should not manipulate on it concurrently.
-
- :param driver: A driver instance
- :param session_state: A state of session
- :param tx_mode: A transaction mode, which is a one from the following choices:
- 1) SerializableReadWrite() which is default mode;
- 2) OnlineReadOnly();
- 3) StaleReadOnly().
- """
- self._driver = driver
- tx_mode = SerializableReadWrite() if tx_mode is None else tx_mode
- self._tx_state = _tx_ctx_impl.TxState(tx_mode)
- self._session_state = session_state
- self.session = session
- self._finished = ""
- self._allow_split_transactions = allow_split_transactions
-
- def __enter__(self):
- """
- Enters a context manager and returns a session
-
- :return: A session instance
- """
- return self
-
- def __exit__(self, *args, **kwargs):
- """
- Closes a transaction context manager and rollbacks transaction if
- it is not rolled back explicitly
- """
- if self._tx_state.tx_id is not None:
- # It's strictly recommended to close transactions directly
- # by using commit_tx=True flag while executing statement or by
- # .commit() or .rollback() methods, but here we trying to do best
- # effort to avoid useless open transactions
- logger.warning("Potentially leaked tx: %s", self._tx_state.tx_id)
- try:
- self.rollback()
- except issues.Error:
- logger.warning("Failed to rollback leaked tx: %s", self._tx_state.tx_id)
-
- self._tx_state.tx_id = None
-
- @property
- def session_id(self):
- """
- A transaction's session id
-
- :return: A transaction's session id
- """
- return self._session_state.session_id
-
- @property
- def tx_id(self):
- """
- Returns a id of open transaction or None otherwise
-
- :return: A id of open transaction or None otherwise
- """
- return self._tx_state.tx_id
-
- def execute(self, query, parameters=None, commit_tx=False, settings=None):
- """
- Sends a query (yql text or an instance of DataQuery) to be executed with parameters.
- Execution with parameters supported only for DataQuery instances and is not supported yql text queries.
-
- :param query: A query, yql text or DataQuery instance.
- :param parameters: A dictionary with parameters values.
- :param commit_tx: A special flag that allows transaction commit
- :param settings: An additional request settings
-
- :return: A result sets or exception in case of execution errors
- """
-
- self._check_split()
- if commit_tx:
- self._set_finish(self._COMMIT)
-
- return self._driver(
- _tx_ctx_impl.execute_request_factory(
- self._session_state,
- self._tx_state,
- query,
- parameters,
- commit_tx,
- settings,
- ),
- _apis.TableService.Stub,
- _apis.TableService.ExecuteDataQuery,
- _tx_ctx_impl.wrap_result_and_tx_id,
- settings,
- (self._session_state, self._tx_state, query),
- self._session_state.endpoint,
- )
-
- def commit(self, settings=None):
- """
- Calls commit on a transaction if it is open otherwise is no-op. If transaction execution
- failed then this method raises PreconditionFailed.
-
- :param settings: A request settings
-
- :return: A committed transaction or exception if commit is failed
- """
-
- self._set_finish(self._COMMIT)
-
- if self._tx_state.tx_id is None and not self._tx_state.dead:
- return self
-
- return self._driver(
- _tx_ctx_impl.commit_request_factory(self._session_state, self._tx_state),
- _apis.TableService.Stub,
- _apis.TableService.CommitTransaction,
- _tx_ctx_impl.wrap_result_on_rollback_or_commit_tx,
- settings,
- (self._session_state, self._tx_state, self),
- self._session_state.endpoint,
- )
-
- def rollback(self, settings=None):
- """
- Calls rollback on a transaction if it is open otherwise is no-op. If transaction execution
- failed then this method raises PreconditionFailed.
-
- :param settings: A request settings
-
- :return: A rolled back transaction or exception if rollback is failed
- """
-
- self._set_finish(self._ROLLBACK)
-
- if self._tx_state.tx_id is None and not self._tx_state.dead:
- return self
-
- return self._driver(
- _tx_ctx_impl.rollback_request_factory(self._session_state, self._tx_state),
- _apis.TableService.Stub,
- _apis.TableService.RollbackTransaction,
- _tx_ctx_impl.wrap_result_on_rollback_or_commit_tx,
- settings,
- (self._session_state, self._tx_state, self),
- self._session_state.endpoint,
- )
-
- def begin(self, settings=None):
- """
- Explicitly begins a transaction
-
- :param settings: A request settings
-
- :return: An open transaction
- """
- if self._tx_state.tx_id is not None:
- return self
-
- self._check_split()
-
- return self._driver(
- _tx_ctx_impl.begin_request_factory(self._session_state, self._tx_state),
- _apis.TableService.Stub,
- _apis.TableService.BeginTransaction,
- _tx_ctx_impl.wrap_tx_begin_response,
- settings,
- (self._session_state, self._tx_state, self),
- self._session_state.endpoint,
- )
-
- def _set_finish(self, val):
- self._check_split(val)
- self._finished = val
-
- def _check_split(self, allow=""):
- """
- Deny all operaions with transaction after commit/rollback.
- Exception: double commit and double rollbacks, because it is safe
- """
- if self._allow_split_transactions:
- return
-
- if self._finished != "" and self._finished != allow:
- raise RuntimeError("Any operation with finished transaction is denied")
-
-
-class TxContext(BaseTxContext):
- @_utilities.wrap_async_call_exceptions
- def async_execute(self, query, parameters=None, commit_tx=False, settings=None):
- """
- Sends a query (yql text or an instance of DataQuery) to be executed with parameters.
- Execution with parameters supported only for DataQuery instances and not supported for YQL text.
-
- :param query: A query: YQL text or DataQuery instance. E
- :param parameters: A dictionary with parameters values.
- :param commit_tx: A special flag that allows transaction commit
- :param settings: A request settings (an instance of ExecDataQuerySettings)
-
- :return: A future of query execution
- """
-
- self._check_split()
-
- return self._driver.future(
- _tx_ctx_impl.execute_request_factory(
- self._session_state,
- self._tx_state,
- query,
- parameters,
- commit_tx,
- settings,
- ),
- _apis.TableService.Stub,
- _apis.TableService.ExecuteDataQuery,
- _tx_ctx_impl.wrap_result_and_tx_id,
- settings,
- (
- self._session_state,
- self._tx_state,
- query,
- ),
- self._session_state.endpoint,
- )
-
- @_utilities.wrap_async_call_exceptions
- def async_commit(self, settings=None):
- """
- Calls commit on a transaction if it is open otherwise is no-op. If transaction execution
- failed then this method raises PreconditionFailed.
-
- :param settings: A request settings (an instance of BaseRequestSettings)
-
- :return: A future of commit call
- """
- self._set_finish(self._COMMIT)
-
- if self._tx_state.tx_id is None and not self._tx_state.dead:
- return _utilities.wrap_result_in_future(self)
-
- return self._driver.future(
- _tx_ctx_impl.commit_request_factory(self._session_state, self._tx_state),
- _apis.TableService.Stub,
- _apis.TableService.CommitTransaction,
- _tx_ctx_impl.wrap_result_on_rollback_or_commit_tx,
- settings,
- (self._session_state, self._tx_state, self),
- self._session_state.endpoint,
- )
-
- @_utilities.wrap_async_call_exceptions
- def async_rollback(self, settings=None):
- """
- Calls rollback on a transaction if it is open otherwise is no-op. If transaction execution
- failed then this method raises PreconditionFailed.
-
- :param settings: A request settings
-
- :return: A future of rollback call
- """
- self._set_finish(self._ROLLBACK)
-
- if self._tx_state.tx_id is None and not self._tx_state.dead:
- return _utilities.wrap_result_in_future(self)
-
- return self._driver.future(
- _tx_ctx_impl.rollback_request_factory(self._session_state, self._tx_state),
- _apis.TableService.Stub,
- _apis.TableService.RollbackTransaction,
- _tx_ctx_impl.wrap_result_on_rollback_or_commit_tx,
- settings,
- (self._session_state, self._tx_state, self),
- self._session_state.endpoint,
- )
-
- @_utilities.wrap_async_call_exceptions
- def async_begin(self, settings=None):
- """
- Explicitly begins a transaction
-
- :param settings: A request settings
-
- :return: A future of begin call
- """
- if self._tx_state.tx_id is not None:
- return _utilities.wrap_result_in_future(self)
-
- self._check_split()
-
- return self._driver.future(
- _tx_ctx_impl.begin_request_factory(self._session_state, self._tx_state),
- _apis.TableService.Stub,
- _apis.TableService.BeginTransaction,
- _tx_ctx_impl.wrap_tx_begin_response,
- settings,
- (self._session_state, self._tx_state, self),
- self._session_state.endpoint,
- )
-
-
-class SessionPool(object):
- def __init__(
- self,
- driver,
- size=100,
- workers_threads_count=4,
- initializer=None,
- min_pool_size=0,
- ):
- """
- An object that encapsulates session creation, deletion and etc. and maintains
- a pool of active sessions of specified size
-
- :param driver: A Driver instance
- :param size: A maximum number of sessions to maintain in the pool
- """
- self._logger = logger.getChild(self.__class__.__name__)
- self._pool_impl = _sp_impl.SessionPoolImpl(
- self._logger,
- driver,
- size,
- workers_threads_count,
- initializer,
- min_pool_size,
- )
- if hasattr(driver, "_driver_config"):
- self.tracer = driver._driver_config.tracer
- else:
- self.tracer = ydb.Tracer(None)
-
- def retry_operation_sync(self, callee, retry_settings=None, *args, **kwargs):
-
- retry_settings = RetrySettings() if retry_settings is None else retry_settings
-
- def wrapped_callee():
- with self.checkout(
- timeout=retry_settings.get_session_client_timeout
- ) as session:
- return callee(session, *args, **kwargs)
-
- return retry_operation_sync(wrapped_callee, retry_settings)
-
- @property
- def active_size(self):
- return self._pool_impl.active_size
-
- @property
- def free_size(self):
- return self._pool_impl.free_size
-
- @property
- def busy_size(self):
- return self._pool_impl.busy_size
-
- @property
- def max_size(self):
- return self._pool_impl.max_size
-
- @property
- def waiters_count(self):
- return self._pool_impl.waiters_count
-
- @tracing.with_trace()
- def subscribe(self):
- return self._pool_impl.subscribe()
-
- @tracing.with_trace()
- def unsubscribe(self, waiter):
- return self._pool_impl.unsubscribe(waiter)
-
- @tracing.with_trace()
- def acquire(self, blocking=True, timeout=None):
- return self._pool_impl.acquire(blocking, timeout)
-
- @tracing.with_trace()
- def release(self, session):
- return self._pool_impl.put(session)
-
- def async_checkout(self):
- """
- Returns a context manager that asynchronously checkouts a session from the pool.
-
- """
- return AsyncSessionCheckout(self)
-
- def checkout(self, blocking=True, timeout=None):
- return SessionCheckout(self, blocking, timeout)
-
- def stop(self, timeout=None):
- self._pool_impl.stop(timeout)
-
- def __enter__(self):
- return self
-
- def __exit__(self, exc_type, exc_val, exc_tb):
- self.stop()
-
-
-class AsyncSessionCheckout(object):
- __slots__ = ("subscription", "pool")
-
- def __init__(self, pool):
- """
- A context manager that asynchronously checkouts a session for the specified pool
- and returns it on manager exit.
-
- :param pool: A SessionPool instance.
- """
- self.pool = pool
- self.subscription = None
-
- def __enter__(self):
- self.subscription = self.pool.subscribe()
- return self.subscription
-
- def __exit__(self, exc_type, exc_val, exc_tb):
- self.pool.unsubscribe(self.subscription)
-
-
-class SessionCheckout(object):
- __slots__ = ("_acquired", "_pool", "_blocking", "_timeout")
-
- def __init__(self, pool, blocking, timeout):
- """
- A context manager that checkouts a session from the specified pool and
- returns it on manager exit.
-
- :param pool: A SessionPool instance
- :param blocking: A flag that specifies that session acquire method should blocks
- :param timeout: A timeout in seconds for session acquire
- """
- self._pool = pool
- self._acquired = None
- self._blocking = blocking
- self._timeout = timeout
-
- def __enter__(self):
- self._acquired = self._pool.acquire(self._blocking, self._timeout)
- return self._acquired
-
- def __exit__(self, exc_type, exc_val, exc_tb):
- if self._acquired is not None:
- self._pool.release(self._acquired)
diff --git a/contrib/python/ydb/py2/ydb/tracing.py b/contrib/python/ydb/py2/ydb/tracing.py
deleted file mode 100644
index 798bab02a3..0000000000
--- a/contrib/python/ydb/py2/ydb/tracing.py
+++ /dev/null
@@ -1,188 +0,0 @@
-from enum import IntEnum
-import functools
-
-
-class TraceLevel(IntEnum):
- DEBUG = 0
- INFO = 1
- ERROR = 2
- NONE = 3
-
-
-class _TracingCtx:
- def __init__(self, tracer, span_name):
- self._enabled = tracer._open_tracer is not None
- self._scope = None
- self._tracer = tracer
- self._span_name = span_name
-
- def __enter__(self):
- """
- Creates new span
- :return: self
- """
- if not self._enabled:
- return self
- self._scope = self._tracer._open_tracer.start_active_span(self._span_name)
- self._scope.span.set_baggage_item("ctx", self)
- self.trace(self._tracer._pre_tags)
- return self
-
- @property
- def enabled(self):
- """
- :return: Is tracing enabled
- """
- return self._enabled
-
- def trace(self, tags, trace_level=TraceLevel.INFO):
- """
- Add tags to current span
-
- :param ydb.TraceLevel trace_level: level of tracing
- :param dict tags: Dict of tags
- """
- if self._tracer._verbose_level < trace_level:
- return
- if not self.enabled or self._scope is None:
- return
- for key, value in tags.items():
- self._scope.span.set_tag(key, value)
-
- def __exit__(self, exc_type, exc_val, exc_tb):
- if not self.enabled:
- return
- if exc_val:
- self.trace(self._tracer._post_tags_err, trace_level=TraceLevel.ERROR)
- self._tracer._on_err(self, exc_type, exc_val, exc_tb)
- else:
- self.trace(self._tracer._post_tags_ok)
- self._scope.close()
- self._scope = None
-
-
-def with_trace(span_name=None):
- def decorator(f):
- @functools.wraps(f)
- def wrapper(self, *args, **kwargs):
- name = (
- span_name
- if span_name is not None
- else self.__class__.__name__ + "." + f.__name__
- )
- with self.tracer.trace(name):
- return f(self, *args, **kwargs)
-
- return wrapper
-
- return decorator
-
-
-def trace(tracer, tags, trace_level=TraceLevel.INFO):
- if tracer.enabled:
- scope = tracer._open_tracer.scope_manager.active
- if not scope:
- return False
-
- ctx = scope.span.get_baggage_item("ctx")
- if ctx is None:
- return False
-
- return ctx.trace(tags, trace_level)
-
-
-class Tracer:
- def __init__(self, tracer):
- """
- Init an tracer to trace requests
-
- :param opentracing.Tracer tracer: opentracing.Tracer implementation. If None - tracing not enabled
- """
- self._open_tracer = tracer
- self._pre_tags = {}
- self._post_tags_ok = {}
- self._post_tags_err = {}
- self._on_err = lambda *args, **kwargs: None
- self._verbose_level = TraceLevel.NONE
-
- @property
- def enabled(self):
- return self._open_tracer is not None
-
- def trace(self, span_name):
- """
- Create tracing context
-
- :param str span_name:
-
- :return: A tracing context
- :rtype: _TracingCtx
- """
- return _TracingCtx(self, span_name)
-
- def with_pre_tags(self, tags):
- """
- Add `tags` to every span immediately after creation
-
- :param dict tags: tags dict
-
- :return: self
- """
- self._pre_tags = tags
- return self
-
- def with_post_tags(self, ok_tags, err_tags):
- """
- Add some tags before span close
-
- :param ok_tags: Add this tags if no error raised
- :param err_tags: Add this tags if there is an exception
-
- :return: self
- """
- self._post_tags_ok = ok_tags
- self._post_tags_err = err_tags
- return self
-
- def with_on_error_callback(self, callee):
- """
- Add an callback, that will be called if there is an exception in span
-
- :param callable[_TracingCtx, exc_type, exc_val, exc_tb] callee:
-
- :return: self
- """
- self._on_err = callee
- return self
-
- def with_verbose_level(self, level):
- self._verbose_level = level
- return self
-
- @classmethod
- def default(cls, tracer):
- """
- Create default tracer
-
- :param tracer:
-
- :return: new tracer
- """
- return (
- cls(tracer)
- .with_post_tags({"ok": True}, {"ok": False})
- .with_pre_tags({"started": True})
- .with_on_error_callback(_default_on_error_callback)
- .with_verbose_level(TraceLevel.INFO)
- )
-
-
-def _default_on_error_callback(ctx, exc_type, exc_val, exc_tb):
- ctx.trace(
- {
- "error.type": exc_type.__name__,
- "error.value": exc_val,
- "error.traceback": exc_tb,
- },
- trace_level=TraceLevel.ERROR,
- )
diff --git a/contrib/python/ydb/py2/ydb/types.py b/contrib/python/ydb/py2/ydb/types.py
deleted file mode 100644
index a62c8a74a0..0000000000
--- a/contrib/python/ydb/py2/ydb/types.py
+++ /dev/null
@@ -1,445 +0,0 @@
-# -*- coding: utf-8 -*-
-import abc
-import enum
-import six
-import json
-from . import _utilities, _apis
-from datetime import date, datetime, timedelta
-import uuid
-import struct
-from google.protobuf import struct_pb2
-
-
-_SECONDS_IN_DAY = 60 * 60 * 24
-_EPOCH = datetime(1970, 1, 1)
-
-if six.PY3:
- _from_bytes = None
-else:
-
- def _from_bytes(x, table_client_settings):
- return _utilities.from_bytes(x)
-
-
-def _from_date(x, table_client_settings):
- if (
- table_client_settings is not None
- and table_client_settings._native_date_in_result_sets
- ):
- return _EPOCH.date() + timedelta(days=x.uint32_value)
- return x.uint32_value
-
-
-def _to_date(pb, value):
- if isinstance(value, date):
- pb.uint32_value = (value - _EPOCH.date()).days
- else:
- pb.uint32_value = value
-
-
-def _from_datetime_number(x, table_client_settings):
- if (
- table_client_settings is not None
- and table_client_settings._native_datetime_in_result_sets
- ):
- return datetime.utcfromtimestamp(x)
- return x
-
-
-def _from_json(x, table_client_settings):
- if (
- table_client_settings is not None
- and table_client_settings._native_json_in_result_sets
- ):
- return json.loads(x)
- if _from_bytes is not None:
- return _from_bytes(x, table_client_settings)
- return x
-
-
-def _to_uuid(value_pb, table_client_settings):
- return uuid.UUID(bytes_le=struct.pack("QQ", value_pb.low_128, value_pb.high_128))
-
-
-def _from_uuid(pb, value):
- pb.low_128 = struct.unpack("Q", value.bytes_le[0:8])[0]
- pb.high_128 = struct.unpack("Q", value.bytes_le[8:16])[0]
-
-
-def _from_interval(value_pb, table_client_settings):
- if (
- table_client_settings is not None
- and table_client_settings._native_interval_in_result_sets
- ):
- return timedelta(microseconds=value_pb.int64_value)
- return value_pb.int64_value
-
-
-def _timedelta_to_microseconds(value):
- return (value.days * _SECONDS_IN_DAY + value.seconds) * 1000000 + value.microseconds
-
-
-def _to_interval(pb, value):
- if isinstance(value, timedelta):
- pb.int64_value = _timedelta_to_microseconds(value)
- else:
- pb.int64_value = value
-
-
-def _from_timestamp(value_pb, table_client_settings):
- if (
- table_client_settings is not None
- and table_client_settings._native_timestamp_in_result_sets
- ):
- return _EPOCH + timedelta(microseconds=value_pb.uint64_value)
- return value_pb.uint64_value
-
-
-def _to_timestamp(pb, value):
- if isinstance(value, datetime):
- pb.uint64_value = _timedelta_to_microseconds(value - _EPOCH)
- else:
- pb.uint64_value = value
-
-
-@enum.unique
-class PrimitiveType(enum.Enum):
- """
- Enumerates all available primitive types that can be used
- in computations.
- """
-
- Int32 = _apis.primitive_types.INT32, "int32_value"
- Uint32 = _apis.primitive_types.UINT32, "uint32_value"
- Int64 = _apis.primitive_types.INT64, "int64_value"
- Uint64 = _apis.primitive_types.UINT64, "uint64_value"
- Int8 = _apis.primitive_types.INT8, "int32_value"
- Uint8 = _apis.primitive_types.UINT8, "uint32_value"
- Int16 = _apis.primitive_types.INT16, "int32_value"
- Uint16 = _apis.primitive_types.UINT16, "uint32_value"
- Bool = _apis.primitive_types.BOOL, "bool_value"
- Double = _apis.primitive_types.DOUBLE, "double_value"
- Float = _apis.primitive_types.FLOAT, "float_value"
-
- String = _apis.primitive_types.STRING, "bytes_value"
- Utf8 = _apis.primitive_types.UTF8, "text_value", _from_bytes
-
- Yson = _apis.primitive_types.YSON, "bytes_value"
- Json = _apis.primitive_types.JSON, "text_value", _from_json
- JsonDocument = _apis.primitive_types.JSON_DOCUMENT, "text_value", _from_json
- UUID = (_apis.primitive_types.UUID, None, _to_uuid, _from_uuid)
- Date = (
- _apis.primitive_types.DATE,
- None,
- _from_date,
- _to_date,
- )
- Datetime = (
- _apis.primitive_types.DATETIME,
- "uint32_value",
- _from_datetime_number,
- )
- Timestamp = (
- _apis.primitive_types.TIMESTAMP,
- None,
- _from_timestamp,
- _to_timestamp,
- )
- Interval = (
- _apis.primitive_types.INTERVAL,
- None,
- _from_interval,
- _to_interval,
- )
-
- DyNumber = _apis.primitive_types.DYNUMBER, "text_value", _from_bytes
-
- def __init__(self, idn, proto_field, to_obj=None, from_obj=None):
- self._idn_ = idn
- self._to_obj = to_obj
- self._from_obj = from_obj
- self._proto_field = proto_field
-
- def get_value(self, value_pb, table_client_settings):
- """
- Extracts value from protocol buffer
- :param value_pb: A protocol buffer
- :return: A valid value of primitive type
- """
- if self._to_obj is not None and self._proto_field:
- return self._to_obj(
- getattr(value_pb, self._proto_field), table_client_settings
- )
-
- if self._to_obj is not None:
- return self._to_obj(value_pb, table_client_settings)
-
- return getattr(value_pb, self._proto_field)
-
- def set_value(self, pb, value):
- """
- Sets value in a protocol buffer
- :param pb: A protocol buffer
- :param value: A valid value to set
- :return: None
- """
- if self._from_obj:
- self._from_obj(pb, value)
- else:
- setattr(pb, self._proto_field, value)
-
- def __str__(self):
- return self._name_
-
- @property
- def proto(self):
- """
- Returns protocol buffer representation of a primitive type
- :return: A protocol buffer representation
- """
- return _apis.ydb_value.Type(type_id=self._idn_)
-
-
-class DataQuery(object):
- __slots__ = ("yql_text", "parameters_types", "name")
-
- def __init__(self, query_id, parameters_types, name=None):
- self.yql_text = query_id
- self.parameters_types = parameters_types
- self.name = _utilities.get_query_hash(self.yql_text) if name is None else name
-
-
-#######################
-# A deprecated alias #
-#######################
-DataType = PrimitiveType
-
-
-class AbstractTypeBuilder(object):
- __metaclass__ = abc.ABCMeta
-
- @property
- @abc.abstractmethod
- def proto(self):
- """
- Returns protocol buffer representation of a type
- :return: A protocol buffer representation
- """
- pass
-
-
-class DecimalType(AbstractTypeBuilder):
- __slots__ = ("_proto", "_precision", "_scale")
-
- def __init__(self, precision=22, scale=9):
- """
- Represents a decimal type
- :param precision: A precision value
- :param scale: A scale value
- """
- self._precision = precision
- self._scale = scale
- self._proto = _apis.ydb_value.Type()
- self._proto.decimal_type.MergeFrom(
- _apis.ydb_value.DecimalType(precision=self._precision, scale=self._scale)
- )
-
- @property
- def precision(self):
- return self._precision
-
- @property
- def scale(self):
- return self._scale
-
- @property
- def proto(self):
- """
- Returns protocol buffer representation of a type
- :return: A protocol buffer representation
- """
- return self._proto
-
- def __eq__(self, other):
- return self._precision == other.precision and self._scale == other.scale
-
- def __str__(self):
- """
- Returns string representation of a type
- :return: A string representation
- """
- return "Decimal(%d,%d)" % (self._precision, self._scale)
-
-
-class NullType(AbstractTypeBuilder):
- __slots__ = ("_repr", "_proto")
-
- def __init__(self):
- self._proto = _apis.ydb_value.Type(null_type=struct_pb2.NULL_VALUE)
-
- @property
- def proto(self):
- return self._proto
-
- def __str__(self):
- return "NullType"
-
-
-class OptionalType(AbstractTypeBuilder):
- __slots__ = ("_repr", "_proto", "_item")
-
- def __init__(self, optional_type):
- """
- Represents optional type that wraps inner type
- :param optional_type: An instance of an inner type
- """
- self._repr = "%s?" % str(optional_type)
- self._proto = _apis.ydb_value.Type()
- self._item = optional_type
- self._proto.optional_type.MergeFrom(
- _apis.ydb_value.OptionalType(item=optional_type.proto)
- )
-
- @property
- def item(self):
- return self._item
-
- @property
- def proto(self):
- """
- Returns protocol buffer representation of a type
- :return: A protocol buffer representation
- """
- return self._proto
-
- def __eq__(self, other):
- return self._item == other.item
-
- def __str__(self):
- return self._repr
-
-
-class ListType(AbstractTypeBuilder):
- __slots__ = ("_repr", "_proto")
-
- def __init__(self, list_type):
- """
- :param list_type: List item type builder
- """
- self._repr = "List<%s>" % str(list_type)
- self._proto = _apis.ydb_value.Type(
- list_type=_apis.ydb_value.ListType(item=list_type.proto)
- )
-
- @property
- def proto(self):
- """
- Returns protocol buffer representation of type
- :return: A protocol buffer representation
- """
- return self._proto
-
- def __str__(self):
- return self._repr
-
-
-class DictType(AbstractTypeBuilder):
- __slots__ = ("__repr", "__proto")
-
- def __init__(self, key_type, payload_type):
- """
- :param key_type: Key type builder
- :param payload_type: Payload type builder
- """
- self._repr = "Dict<%s,%s>" % (str(key_type), str(payload_type))
- self._proto = _apis.ydb_value.Type(
- dict_type=_apis.ydb_value.DictType(
- key=key_type.proto,
- payload=payload_type.proto,
- )
- )
-
- @property
- def proto(self):
- return self._proto
-
- def __str__(self):
- return self._repr
-
-
-class TupleType(AbstractTypeBuilder):
- __slots__ = ("__elements_repr", "__proto")
-
- def __init__(self):
- self.__elements_repr = []
- self.__proto = _apis.ydb_value.Type(tuple_type=_apis.ydb_value.TupleType())
-
- def add_element(self, element_type):
- """
- :param element_type: Adds additional element of tuple
- :return: self
- """
- self.__elements_repr.append(str(element_type))
- element = self.__proto.tuple_type.elements.add()
- element.MergeFrom(element_type.proto)
- return self
-
- @property
- def proto(self):
- return self.__proto
-
- def __str__(self):
- return "Tuple<%s>" % ",".join(self.__elements_repr)
-
-
-class StructType(AbstractTypeBuilder):
- __slots__ = ("__members_repr", "__proto")
-
- def __init__(self):
- self.__members_repr = []
- self.__proto = _apis.ydb_value.Type(struct_type=_apis.ydb_value.StructType())
-
- def add_member(self, name, member_type):
- """
- :param name:
- :param member_type:
- :return:
- """
- self.__members_repr.append("%s:%s" % (name, str(member_type)))
- member = self.__proto.struct_type.members.add()
- member.name = name
- member.type.MergeFrom(member_type.proto)
- return self
-
- @property
- def proto(self):
- return self.__proto
-
- def __str__(self):
- return "Struct<%s>" % ",".join(self.__members_repr)
-
-
-class BulkUpsertColumns(AbstractTypeBuilder):
- __slots__ = ("__columns_repr", "__proto")
-
- def __init__(self):
- self.__columns_repr = []
- self.__proto = _apis.ydb_value.Type(struct_type=_apis.ydb_value.StructType())
-
- def add_column(self, name, column_type):
- """
- :param name: A column name
- :param column_type: A column type
- """
- self.__columns_repr.append("%s:%s" % (name, column_type))
- column = self.__proto.struct_type.members.add()
- column.name = name
- column.type.MergeFrom(column_type.proto)
- return self
-
- @property
- def proto(self):
- return self.__proto
-
- def __str__(self):
- return "BulkUpsertColumns<%s>" % ",".join(self.__columns_repr)
diff --git a/contrib/python/ydb/py2/ydb/ydb_version.py b/contrib/python/ydb/py2/ydb/ydb_version.py
deleted file mode 100644
index 2d5adec923..0000000000
--- a/contrib/python/ydb/py2/ydb/ydb_version.py
+++ /dev/null
@@ -1 +0,0 @@
-VERSION = "2.15.2"