From 2197c6ebb266b6b398f9f925c4a57b0137f30592 Mon Sep 17 00:00:00 2001 From: Elie Saad Date: Wed, 12 Feb 2020 16:46:34 +0200 Subject: [PATCH 01/11] chore: md and English linting --- writeups/owasp_in_sdlc/owasp_in_sdlc.md | 33 +++++++++---------------- 1 file changed, 12 insertions(+), 21 deletions(-) diff --git a/writeups/owasp_in_sdlc/owasp_in_sdlc.md b/writeups/owasp_in_sdlc/owasp_in_sdlc.md index 3f3cb11bf..36dd4967f 100644 --- a/writeups/owasp_in_sdlc/owasp_in_sdlc.md +++ b/writeups/owasp_in_sdlc/owasp_in_sdlc.md @@ -1,17 +1,10 @@ ---- -title: OWASP in SDLC -layout: col-document -tags: SDLC standards integration -document: integration standards ---- - ## OWASP Application Security Fragmentation _Or how I worried less and stood on the shoulders of giants. - Spyros Gasteratos, Elie Saad_ ### 1. The Software Development LifeCycle and You -The Systems Development Lifecycle (SDLC) is often depicted as a 6 part cyclical process where every step builds on top of the previous ones. In a similar fashion, security can be embedded in a SDLC by building on top of previous steps with policies, controls, designs, implementations and tests making sure that the product only performs the functions it was designed to and nothing more. +The Systems Development Lifecycle is often depicted as a 6 part cyclical process where every step builds on top of the previous ones. In a similar fashion, security can be embedded in a SDLC by building on top of previous steps with policies, controls, designs, implementations and tests making sure that the product only performs the functions it was designed to and nothing more. However, modern Agile practitioners often find themselves at an impasse, there is a wealth of competing projects, standards and vendors who all claim to be the best solution in the field. @@ -33,21 +26,19 @@ In case of internal development and if the organisation maps Features to Epics, **Example low maturity scenario:** -An application that aggregates data from a number of data stores is commissioned. -The application must offer a unified API for data querying. -The users of the system will be customer employees. The application needs to be accessible from the internet. +Customer commission's application that aggregates data from a number of stores offering a unified API for all data querying and retrieval. The users of the system will be customer employees. The application needs to be accessible from the internet. Nature of data accessed, retention times, transport method, and backend communication methods aren't considered. **Example high maturity scenario:** -The implementor uses a mature SDLC, the engineering teams receive security training, and a detailed list of requirements has been drawn and verified by the customer. +The implementor uses a mature Secure Development Lifecycle, the engineering teams receive security training, and a detailed list of requirements has been drawn and verified by the customer. #### 1.2. Design Stage Once requirements are gathered and analysis is performed, implementation specifics need to be defined. The outcome of this stage is usually a diagram outlining data flows and a general system architecture. This presents an opportunity for both threat modeling and attaching security considerations to every ticket and epic that is the outcome of this stage. -There is some great advice on threat modeling out there *e.g.* [this](https://arstechnica.com/information-technology/2017/07/how-i-learned-to-stop-worrying-mostly-and-love-my-threat-model/) article or [this](https://www.microsoft.com/en-us/securityengineering/sdl/threatmodeling) one. +There is some great advice on threat modeling out there e.g. [this](https://arstechnica.com/information-technology/2017/07/how-i-learned-to-stop-worrying-mostly-and-love-my-threat-model/) article or [this](https://www.microsoft.com/en-us/securityengineering/sdl/threatmodeling) one. A bite sized primer by Adam Shostack himself can be found [here](https://adam.shostack.org/blog/2018/03/threat-modeling-panel-at-appsec-cali-2018/). @@ -75,7 +66,7 @@ Remote data store access secrets are hardcoded in the configuration files. All c Frontend serves data over GraphQL as a thin layer between caching system and end user. -GraphQL queries are dynamically translated to SQL, Elasticsearch and NoSQL queries. Access to data is protected with basic auth set to _1234:1234_ for development purposes. +GraphQL queries are dynamically translated to SQL, Elasticsearch and NoSQL queries. Access to data is protected with basic auth set to_ 1234:1234_ for development purposes. **Example High Maturity Scenario:** @@ -94,7 +85,7 @@ The development stage is where assumptions and decisions made in the previous st There has been [extensive discussion](https://docs.google.com/presentation/d/1zbj9XBiv6r6zla0KHNfs63Ux45QZAfRut2zlK7o-dRw/mobilepresent?slide=id.g7c8a58b51e_0_4) on how to approach secure application development from an agile point of view. However, it ultimately depends on parameters specific to each organisation, such as engineering culture, size and competency/seniority of teams, tools available and the maturity of the security programme. -Anecdotal evidence points towards code pattern libraries, code anti-pattern libraries, library wrappers with secure defaults, linter configuration, and extensive testing suites that attempt to test for security abuse stories. +Anecdotal evidence, points towards code pattern libraries, code anti-pattern libraries, library wrappers with secure defaults, linter configuration, and extensive testing suites that attempt to test for security abuse stories. SAMM at this stage offers the following [generic implementation considerations](https://owaspsamm.org/model/implementation/): @@ -142,9 +133,9 @@ Testing can be performed several ways and it highly depends on the nature of the If available, automation is a good idea as it allows detection of easy to find vulnerabilities without much human interaction. -If the application communicates using a web-based protocol, the [ZAP](https://github.com/zaproxy/zaproxy) project can be used to automate a great number of web related attacks and detection. ZAP can be orchestrated using its REST API and it can even automate multi-stage attacks by leveraging its Zest scripting support. +If the application communicates using a web-based protocol, the [ZAProxy](https://github.com/zaproxy/zaproxy) project can be used to automate a great number of web related attacks and detection. ZAP can be orchestrated using its REST API and it can even automate multi-stage attacks by leveraging its Zest scripting support. -Vulnerabilities from ZAP and a wide variety of other tools can be imported and managed using a dedicated defect management platform such as [Defect Dojo](https://github.com/DefectDojo/django-DefectDojo)(screenshot below). +Vulnerabilities from ZAProxy and a wide variety of other tools can be imported and managed using a dedicated defect management platform such as [Defect Dojo](https://github.com/DefectDojo/django-DefectDojo)(screenshot below). ![Defect Dojo](images/defectdojo.png "Defect Dojo") @@ -156,7 +147,7 @@ The business deployed the system to production without testing. Soon after, the **Example High Maturity Scenario:** -The application features received Dynamic Automated testing when each reached staging, a trained QA team validated business requirements that involved security checks. A security team performed an adequate pentest and gave a sign-off. +The application features received Dynamic Automated testing when each reached staging, a trained QA team validated business requirements that involved security. A security team performed an adequate pentest and gave a sign-off. #### 1.5. Release Stage @@ -182,7 +173,7 @@ The CI/CD system, when migrating successful QA environments to production, appli Secrets live in-memory only and are persisted in a dedicated Secrets Storage solution such as Hashicorp Vault. -All application's ingress points are protected by a WAF coupled with DoS protection. +All application's ingress points are protected by a WAF and DoS protection. Logging from all components gets aggregated in dashboards and alerts are raised based on several Thresholds and events. There are canary values and events fired against monitoring from time to time to validate it works. @@ -192,9 +183,9 @@ Business continuity and Security teams run incident management drills periodical A successful project will hopefully exist for several SDLC cycles. Each cycle adding features and fixing bugs based on the input from previous ones. The time in this stage is often invested in [Retrospective Meetings](https://www.scrum.org/resources/what-is-a-sprint-retrospective), metrics gathering, various admin work, and training or culture building. -The Open Source community at this stage comes to the rescue with a number of high quality guides, applications, frameworks, and complete integrated solutions. +The Open Source community at this stage comes to the rescue with a number of high quality guides, applications, frameworks and complete integrated solutions. -Concerning metrics, the community has been quite vocal on what to measure and how important it is. The OWASP CISO guide offers 3 broad categories of SDLC metrics[1] which can be used to measure effectiveness of security practices. Moreover, there is a number of presentations on what could be leveraged to improve a security programme, starting from Marcus' Ranum's [keynote](https://www.youtube.com/watch?v=yW7kSVwucSk) at Appsec California[1], Caroline Wong's similar [presentation](https://www.youtube.com/watch?v=dY8IuQ8rUd4) and [this presentation](https://www.youtube.com/watch?v=-XI2DL2Uulo) by J. Rose and R. Sulatycki. These among several writeups by private companies all offering their own version of what could be measured. +Concerning metrics, the community has been quite vocal on what to measure and how important it is, the OWASP CISO guide, offers 3 broad categories of SDLC metrics[1] which can be used to measure effectiveness of security practices. Moreover, there is a number of presentations on what could be leveraged to improve a security programme, starting from Marcus' Ranum's [keynote](https://www.youtube.com/watch?v=yW7kSVwucSk) at Appsec California[1], Caroline Wong's similar [presentation](https://www.youtube.com/watch?v=dY8IuQ8rUd4) and [this presentation](https://www.youtube.com/watch?v=-XI2DL2Uulo) by J. Rose and R. Sulatycki. These among several writeups by private companies all offering their own version of what could be measured. However, metrics won't necessarily improve without training engineering teams and somehow building a security-minded culture. Security training is a long and complicated discussion. There is a variety of approaches out there, on the testing-only end of the spectrum there is fully black box virtual machines such as [DVWA](http://www.dvwa.co.uk/), [Metasploitable series](https://metasploit.help.rapid7.com/docs/metasploitable-2) and the [VulnHub](https://www.vulnhub.com/) project. From c72db482f47152443471470eb9fba24aef50e22f Mon Sep 17 00:00:00 2001 From: Elie Saad Date: Wed, 12 Feb 2020 17:05:47 +0200 Subject: [PATCH 02/11] chore: English touch-up --- writeups/owasp_in_sdlc/owasp_in_sdlc.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/writeups/owasp_in_sdlc/owasp_in_sdlc.md b/writeups/owasp_in_sdlc/owasp_in_sdlc.md index 36dd4967f..116982644 100644 --- a/writeups/owasp_in_sdlc/owasp_in_sdlc.md +++ b/writeups/owasp_in_sdlc/owasp_in_sdlc.md @@ -4,7 +4,7 @@ _Or how I worried less and stood on the shoulders of giants. - Spyros Gasteratos ### 1. The Software Development LifeCycle and You -The Systems Development Lifecycle is often depicted as a 6 part cyclical process where every step builds on top of the previous ones. In a similar fashion, security can be embedded in a SDLC by building on top of previous steps with policies, controls, designs, implementations and tests making sure that the product only performs the functions it was designed to and nothing more. +The Systems Development Lifecycle (SDLC) is often depicted as a 6 part cyclical process where every step builds on top of the previous ones. In a similar fashion, security can be embedded in a SDLC by building on top of previous steps with policies, controls, designs, implementations and tests making sure that the product only performs the functions it was designed to and nothing more. However, modern Agile practitioners often find themselves at an impasse, there is a wealth of competing projects, standards and vendors who all claim to be the best solution in the field. @@ -32,13 +32,13 @@ Nature of data accessed, retention times, transport method, and backend communic **Example high maturity scenario:** -The implementor uses a mature Secure Development Lifecycle, the engineering teams receive security training, and a detailed list of requirements has been drawn and verified by the customer. +The implementor uses a mature SDLC, the engineering teams receive security training, and a detailed list of requirements has been drawn and verified by the customer. #### 1.2. Design Stage Once requirements are gathered and analysis is performed, implementation specifics need to be defined. The outcome of this stage is usually a diagram outlining data flows and a general system architecture. This presents an opportunity for both threat modeling and attaching security considerations to every ticket and epic that is the outcome of this stage. -There is some great advice on threat modeling out there e.g. [this](https://arstechnica.com/information-technology/2017/07/how-i-learned-to-stop-worrying-mostly-and-love-my-threat-model/) article or [this](https://www.microsoft.com/en-us/securityengineering/sdl/threatmodeling) one. +There is some great advice on threat modeling out there *e.g.* [this](https://arstechnica.com/information-technology/2017/07/how-i-learned-to-stop-worrying-mostly-and-love-my-threat-model/) article or [this](https://www.microsoft.com/en-us/securityengineering/sdl/threatmodeling) one. A bite sized primer by Adam Shostack himself can be found [here](https://adam.shostack.org/blog/2018/03/threat-modeling-panel-at-appsec-cali-2018/). @@ -85,7 +85,7 @@ The development stage is where assumptions and decisions made in the previous st There has been [extensive discussion](https://docs.google.com/presentation/d/1zbj9XBiv6r6zla0KHNfs63Ux45QZAfRut2zlK7o-dRw/mobilepresent?slide=id.g7c8a58b51e_0_4) on how to approach secure application development from an agile point of view. However, it ultimately depends on parameters specific to each organisation, such as engineering culture, size and competency/seniority of teams, tools available and the maturity of the security programme. -Anecdotal evidence, points towards code pattern libraries, code anti-pattern libraries, library wrappers with secure defaults, linter configuration, and extensive testing suites that attempt to test for security abuse stories. +Anecdotal evidence points towards code pattern libraries, code anti-pattern libraries, library wrappers with secure defaults, linter configuration, and extensive testing suites that attempt to test for security abuse stories. SAMM at this stage offers the following [generic implementation considerations](https://owaspsamm.org/model/implementation/): @@ -147,7 +147,7 @@ The business deployed the system to production without testing. Soon after, the **Example High Maturity Scenario:** -The application features received Dynamic Automated testing when each reached staging, a trained QA team validated business requirements that involved security. A security team performed an adequate pentest and gave a sign-off. +The application features received Dynamic Automated testing when each reached staging, a trained QA team validated business requirements that involved security checks. A security team performed an adequate pentest and gave a sign-off. #### 1.5. Release Stage @@ -173,7 +173,7 @@ The CI/CD system, when migrating successful QA environments to production, appli Secrets live in-memory only and are persisted in a dedicated Secrets Storage solution such as Hashicorp Vault. -All application's ingress points are protected by a WAF and DoS protection. +All application's ingress points are protected by a WAF coupled with DoS protection. Logging from all components gets aggregated in dashboards and alerts are raised based on several Thresholds and events. There are canary values and events fired against monitoring from time to time to validate it works. @@ -183,9 +183,9 @@ Business continuity and Security teams run incident management drills periodical A successful project will hopefully exist for several SDLC cycles. Each cycle adding features and fixing bugs based on the input from previous ones. The time in this stage is often invested in [Retrospective Meetings](https://www.scrum.org/resources/what-is-a-sprint-retrospective), metrics gathering, various admin work, and training or culture building. -The Open Source community at this stage comes to the rescue with a number of high quality guides, applications, frameworks and complete integrated solutions. +The Open Source community at this stage comes to the rescue with a number of high quality guides, applications, frameworks, and complete integrated solutions. -Concerning metrics, the community has been quite vocal on what to measure and how important it is, the OWASP CISO guide, offers 3 broad categories of SDLC metrics[1] which can be used to measure effectiveness of security practices. Moreover, there is a number of presentations on what could be leveraged to improve a security programme, starting from Marcus' Ranum's [keynote](https://www.youtube.com/watch?v=yW7kSVwucSk) at Appsec California[1], Caroline Wong's similar [presentation](https://www.youtube.com/watch?v=dY8IuQ8rUd4) and [this presentation](https://www.youtube.com/watch?v=-XI2DL2Uulo) by J. Rose and R. Sulatycki. These among several writeups by private companies all offering their own version of what could be measured. +Concerning metrics, the community has been quite vocal on what to measure and how important it is. The OWASP CISO guide offers 3 broad categories of SDLC metrics[1] which can be used to measure effectiveness of security practices. Moreover, there is a number of presentations on what could be leveraged to improve a security programme, starting from Marcus' Ranum's [keynote](https://www.youtube.com/watch?v=yW7kSVwucSk) at Appsec California[1], Caroline Wong's similar [presentation](https://www.youtube.com/watch?v=dY8IuQ8rUd4) and [this presentation](https://www.youtube.com/watch?v=-XI2DL2Uulo) by J. Rose and R. Sulatycki. These among several writeups by private companies all offering their own version of what could be measured. However, metrics won't necessarily improve without training engineering teams and somehow building a security-minded culture. Security training is a long and complicated discussion. There is a variety of approaches out there, on the testing-only end of the spectrum there is fully black box virtual machines such as [DVWA](http://www.dvwa.co.uk/), [Metasploitable series](https://metasploit.help.rapid7.com/docs/metasploitable-2) and the [VulnHub](https://www.vulnhub.com/) project. From 86067cf4944d34c8be6b1b49553fda862b0a14fb Mon Sep 17 00:00:00 2001 From: Elie Saad Date: Wed, 3 Jun 2020 20:29:50 +0300 Subject: [PATCH 03/11] chore: update sdlc file name --- index.md | 2 +- writeups/owasp_in_sdlc/owasp_in_sdlc.md | 212 ------------------------ 2 files changed, 1 insertion(+), 213 deletions(-) delete mode 100644 writeups/owasp_in_sdlc/owasp_in_sdlc.md diff --git a/index.md b/index.md index 4ad5a6bbd..8d631b0b8 100644 --- a/index.md +++ b/index.md @@ -25,6 +25,6 @@ The below is a rough estimation as it is dependent on other projects' time and a The roadmap will be adjusted as the project moves forward. -## OWASP in the SDLC +## OWASP In the SDLC In an effort to provide a high level map of how OWASP's projects link to the SDLC, a document detailing [OWASP in the SDLC](writeups/owasp_in_sdlc/owasp_in_sdlc.md) diff --git a/writeups/owasp_in_sdlc/owasp_in_sdlc.md b/writeups/owasp_in_sdlc/owasp_in_sdlc.md deleted file mode 100644 index 116982644..000000000 --- a/writeups/owasp_in_sdlc/owasp_in_sdlc.md +++ /dev/null @@ -1,212 +0,0 @@ -## OWASP Application Security Fragmentation - -_Or how I worried less and stood on the shoulders of giants. - Spyros Gasteratos, Elie Saad_ - -### 1. The Software Development LifeCycle and You - -The Systems Development Lifecycle (SDLC) is often depicted as a 6 part cyclical process where every step builds on top of the previous ones. In a similar fashion, security can be embedded in a SDLC by building on top of previous steps with policies, controls, designs, implementations and tests making sure that the product only performs the functions it was designed to and nothing more. - -However, modern Agile practitioners often find themselves at an impasse, there is a wealth of competing projects, standards and vendors who all claim to be the best solution in the field. - -The following article attempts to provide a long list of Free (as in Freedom) and Open Source solutions and frameworks that worked for us. It's split into 6 sections, mapping loosely with the SDLC stages on the diagram below. Each section involves somewhat exaggerated low and high maturity scenarios of following the approach listed in it. The entire article can be summarised by the diagram at its end. - -![SDLC Diagram](images/sdlc_diag.png "typical SDLC diagram") - -#### 1.1. Planning aka Requirements Gathering & Analysis - -The Requirements gathering process tries to answer the question: _"What is the system going to do?"_ At this stage, the [SAMM project](https://owaspsamm.org/model/) offers 3 distinct maturity levels covering both [in-house](https://owaspsamm.org/model/design/security-requirements/stream-a/) software development and [third party](https://owaspsamm.org/model/design/security-requirements/stream-b/) supplier security. - -![SAMM Requirements](images/OWASP-in0.png "SAMM Requirements") - -Organisations can use these to add solid security considerations at the start of the Software Development or Procurement process. - -These general security considerations can be audited by using a subsection of the ASVS controls in section V1 as a questionnaire. This process attempts to ensure that every feature has concrete security considerations. - -In case of internal development and if the organisation maps Features to Epics, the [Security Knowledge Framework](https://securityknowledgeframework.org/) can be used to facilitate this process by leveraging its questionnaire function, shown below. - -**Example low maturity scenario:** - -Customer commission's application that aggregates data from a number of stores offering a unified API for all data querying and retrieval. The users of the system will be customer employees. The application needs to be accessible from the internet. - -Nature of data accessed, retention times, transport method, and backend communication methods aren't considered. - -**Example high maturity scenario:** - -The implementor uses a mature SDLC, the engineering teams receive security training, and a detailed list of requirements has been drawn and verified by the customer. - -#### 1.2. Design Stage - -Once requirements are gathered and analysis is performed, implementation specifics need to be defined. The outcome of this stage is usually a diagram outlining data flows and a general system architecture. This presents an opportunity for both threat modeling and attaching security considerations to every ticket and epic that is the outcome of this stage. - -There is some great advice on threat modeling out there *e.g.* [this](https://arstechnica.com/information-technology/2017/07/how-i-learned-to-stop-worrying-mostly-and-love-my-threat-model/) article or [this](https://www.microsoft.com/en-us/securityengineering/sdl/threatmodeling) one. - -A bite sized primer by Adam Shostack himself can be found [here](https://adam.shostack.org/blog/2018/03/threat-modeling-panel-at-appsec-cali-2018/). - -OWASP includes a short [article](https://wiki.owasp.org/index.php/Category:Threat_Modeling) on Threat Modeling along with a relevant [Cheatsheet](https://cheatsheetseries.owasp.org/cheatsheets/Threat_Modeling_Cheat_Sheet.html). Moreover, if you're following OWASP SAMM, it has a short section on [Threat Assessment](https://owaspsamm.org/model/design/threat-assessment/). - -There's a few projects that can help with creating Threat Models at this stage, [PyTM](https://github.com/izar/pytm) is one, [ThreatSpec](https://github.com/threatspec/threatspec) is another. - -> Note: _A threat model can be as simple as a data flow diagram with attack vectors on every flow and asset and equivalent remediations. An example can be found below._ - -![Threat Model](images/threat_model.png "Threat Model") - -Last, if the organisation maps Features to Epics, the Security Knowledge Framework (SKF) can be used to facilitate this process by leveraging it's questionnaire function. - -![SKF](images/skf_qs.png "SKF") - -This practice has the side effect that it trains non-security specialists to think like attackers. - -The outcomes of this stage should help lay the foundation of secure design and considerations. - -**Example Low Maturity Scenario:** - -Following vague feature requirements the design includes caching data to a local unencrypted database with a hardcoded password. - -Remote data store access secrets are hardcoded in the configuration files. All communication between backend systems is plaintext. - -Frontend serves data over GraphQL as a thin layer between caching system and end user. - -GraphQL queries are dynamically translated to SQL, Elasticsearch and NoSQL queries. Access to data is protected with basic auth set to_ 1234:1234_ for development purposes. - -**Example High Maturity Scenario:** - -Based on a detailed threat model defined and updated through code, the team decides the following: - -* Local encrypted caches need to expire and auto-purged. -* Communication channels encrypted and authenticated. -* All secrets persisted in shared secrets store. -* Frontend designed with permissions model integration. -* Permissions matrix defined. -* Input is escaped output is encoded appropriately using well established libraries. - -#### 1.3. Development Stage - -The development stage is where assumptions and decisions made in the previous steps will be tested. It's also the stage where implementation specific bugs happen. - -There has been [extensive discussion](https://docs.google.com/presentation/d/1zbj9XBiv6r6zla0KHNfs63Ux45QZAfRut2zlK7o-dRw/mobilepresent?slide=id.g7c8a58b51e_0_4) on how to approach secure application development from an agile point of view. However, it ultimately depends on parameters specific to each organisation, such as engineering culture, size and competency/seniority of teams, tools available and the maturity of the security programme. - -Anecdotal evidence points towards code pattern libraries, code anti-pattern libraries, library wrappers with secure defaults, linter configuration, and extensive testing suites that attempt to test for security abuse stories. - -SAMM at this stage offers the following [generic implementation considerations](https://owaspsamm.org/model/implementation/): - -![SAMM Implementation Considerations](images/impl_samm.png "SAMM Implementation Considerations") - -At any maturity level, linters can be introduced to ensure that consistent code is being added. For most linters, there are IDE integrations providing software engineers with the ability to validate code correctness during development time. Several linters also include security specific rules. This allows for basic security checks before the code is even committed. For example, if you write in Typescript, you can use [tslint](https://github.com/palantir/tslint) along with [tslint-config-security](https://www.npmjs.com/package/tslint-config-security) to easily and quickly perform basic checks. - -However, linters cannot detect vulnerabilities in third party libraries, and as software supply chain attacks spread, this consideration becomes more important. To track third party library usage and audit their security you can use [Dependency Check/Track](https://dependencytrack.org/). - -To tackle the security of code developed in-house, OWASP offers an extensive collection of [Cheatsheets](https://cheatsheetseries.owasp.org/) demonstrating how to implement features securely. Moreover, the Security Knowledge Framework[1] offers an extensive library of code patterns spanning several programming languages. These patterns can be used to not only jumpstart the development process, but also do so securely. - -![SKF Code](images/skf_code.png "SKF Code") - -Last, there is an abundance of libraries and frameworks implementing secure defaults. For frontend development, [ReactJS](https://reactjs.org/) seems to be the latest favourite in the Javascript world. - -On the database side, there are [ORM](https://sequelize.org/) libraries and [Query Builders](https://github.com/kayak/pypika) for most languages. - -If you write in Java, the [ESAPI project](https://www.javadoc.io/doc/org.owasp.esapi/esapi/latest/index.html) offers several methods to securely implement features, ranging from Cryptography to input escaping and output encoding. - -**Example Low Maturity Scenario:** - -The team attempted to build the requested features using vanilla NodeJS, connectivity to backend systems is validated by firing an internal request to `/healthcheck?remoteHost=` which attempts to run a ping command against the IP specified. All secrets are hard coded. The team uses off the shelf GraphQL libraries but versions are not checked using [NPM Audit](https://docs.npmjs.com/cli/audit). Development is performed by pushing to master which triggers a webhook that uses FTP to copy latest master to the development server which will become production once development is finished. - -**Example High Maturity Scenario:** - -Team members have access to comprehensive documentation and a library of code snippets they can use to accelerate development. - -Linters are bundled with pre-commit hooks and no code reaches master without peer review. - -Pre-merge tests are executed before merging code into master. Tests run a comprehensive suite of tests covering unit tests, service acceptance tests, unit tests as well as regression tests. - -Once a day a pipeline of specially configured static code analysis tools runs against the features merged that day, the results are triaged by a trained security team and fed to engineering. - -There is a cronjob executing Dynamic Analysis tools against Staging with a similar process. - -Pentests are conducted against features released on every release and also periodically against the whole software stack. - -#### 1.4. Testing Stage - -This stage can be used to validate software correctness and it's results as a metric for the security related decisions of the previous stages. At this stage both automated and manual testing can be performed. SAMM again offers 3 maturity levels across Architecture Reviews, Requirements testing, and Security Testing. Instructions can be found [here](https://owaspsamm.org/model/verification/) and a screenshot is listed below. - -![SAMM Testing](images/samm_testing.png "SAMM Testing") - -Testing can be performed several ways and it highly depends on the nature of the software, the organisation's cadence, and the regulatory requirements among other things. - -If available, automation is a good idea as it allows detection of easy to find vulnerabilities without much human interaction. - -If the application communicates using a web-based protocol, the [ZAProxy](https://github.com/zaproxy/zaproxy) project can be used to automate a great number of web related attacks and detection. ZAP can be orchestrated using its REST API and it can even automate multi-stage attacks by leveraging its Zest scripting support. - -Vulnerabilities from ZAProxy and a wide variety of other tools can be imported and managed using a dedicated defect management platform such as [Defect Dojo](https://github.com/DefectDojo/django-DefectDojo)(screenshot below). - -![Defect Dojo](images/defectdojo.png "Defect Dojo") - -For manual testing the [Web](https://github.com/OWASP/wstg) and [Mobile](https://github.com/OWASP/owasp-mstg) Security Testing Guides can be used to achieve a base level of quality for human driven testing. - -**Example Low Maturity Scenario:** - -The business deployed the system to production without testing. Soon after, the client's routine pentests uncovered deep flaws with access to backend data and services. The remediation effort was significant. - -**Example High Maturity Scenario:** - -The application features received Dynamic Automated testing when each reached staging, a trained QA team validated business requirements that involved security checks. A security team performed an adequate pentest and gave a sign-off. - -#### 1.5. Release Stage - -Hopefully by this stage, features are adequately designed, written, and tested. This stage involves configuration, resilience and observability. Here, the Mod Security [Core Rule Set](https://github.com/OWASP/www-project-modsecurity-core-rule-set) can be used to effectively detect and block several attacks against the platform. - -Moreover, secure configuration standards can be tested for using the [Open Policy Agent](https://www.openpolicyagent.org/). - -Last projects such as the [ELK stack](https://www.elastic.co/elastic-stack), [Grafana](https://grafana.com/) and [Prometheus](https://prometheus.io/docs/introduction/overview/) can be used to aggregate logging and provide observability. - -However, no matter the WAFs, Logging, and secure configuration enforced at this stage, incidents will occur eventually. Incident management is a complicated and high stress process. To prepare organisations for this, SAMM includes a section on [incident management](https://owaspsamm.org/model/operations/incident-management/) involving simple questions for stakeholders to answer so you can determine incident preparedness accurately. - -![SAMM Release](images/samm_release.png "SAMM Release") - -**Example low maturity scenario:** - -The API was queryable by anyone and GraphQL introspection was enabled since all components were left in debug configuration. - -Sensitive API paths were not whitelisted. The team found that the application was attacked when the server showed very high CPU load. The response was to bring the system down, very little information about the attack was found apart from the fact that someone was mining cryptocurrencies on the server. - -**Example High Maturity scenario:** - -The CI/CD system, when migrating successful QA environments to production, applies appropriate configuration to all components. Configuration is tested periodically for drift. - -Secrets live in-memory only and are persisted in a dedicated Secrets Storage solution such as Hashicorp Vault. - -All application's ingress points are protected by a WAF coupled with DoS protection. - -Logging from all components gets aggregated in dashboards and alerts are raised based on several Thresholds and events. There are canary values and events fired against monitoring from time to time to validate it works. - -Business continuity and Security teams run incident management drills periodically to refresh incident playbook knowledge. - -### 2. The In-Between Stage - -A successful project will hopefully exist for several SDLC cycles. Each cycle adding features and fixing bugs based on the input from previous ones. The time in this stage is often invested in [Retrospective Meetings](https://www.scrum.org/resources/what-is-a-sprint-retrospective), metrics gathering, various admin work, and training or culture building. - -The Open Source community at this stage comes to the rescue with a number of high quality guides, applications, frameworks, and complete integrated solutions. - -Concerning metrics, the community has been quite vocal on what to measure and how important it is. The OWASP CISO guide offers 3 broad categories of SDLC metrics[1] which can be used to measure effectiveness of security practices. Moreover, there is a number of presentations on what could be leveraged to improve a security programme, starting from Marcus' Ranum's [keynote](https://www.youtube.com/watch?v=yW7kSVwucSk) at Appsec California[1], Caroline Wong's similar [presentation](https://www.youtube.com/watch?v=dY8IuQ8rUd4) and [this presentation](https://www.youtube.com/watch?v=-XI2DL2Uulo) by J. Rose and R. Sulatycki. These among several writeups by private companies all offering their own version of what could be measured. - -However, metrics won't necessarily improve without training engineering teams and somehow building a security-minded culture. Security training is a long and complicated discussion. There is a variety of approaches out there, on the testing-only end of the spectrum there is fully black box virtual machines such as [DVWA](http://www.dvwa.co.uk/), [Metasploitable series](https://metasploit.help.rapid7.com/docs/metasploitable-2) and the [VulnHub](https://www.vulnhub.com/) project. - -The code & remediation end of the spectrum isn't as well-developed, mainly due to the complexity involved in building and distributing such material. However, there are some respectable solutions, [Remediate The Flag](https://www.remediatetheflag.com/) can be used to setup a code based challenge. - -![Remediate the Flag](images/rtf.png "Remediate the Flag") - -However, if questionnaires are the preferred medium, or if the organisation is looking for self-service testing, [Secure Coding Dojo](https://github.com/trendmicro/SecureCodingDojo) is an interesting solution. - -More on the self-service side, the Security Knowledge Framework has released several [Labs](https://owasp-skf.gitbook.io/asvs-write-ups/) that each showcase one vulnerability and provides information on how to exploit it. - -However, to our knowledge, the most flexible project out there is probably the [Juice Shop](https://github.com/bkimminich/juice-shop), deployed on Heroku with one click, it offers both CTF functionality and a self-service standalone application that comes with solution detection and a comprehensive progress-board. - -![Juice Shop](images/juiceshop.png "Juice Shop") - -Bringing it all together, a security team could gather metrics on vulnerabilities detected by team or service using the detection related projects outlined above, then either ask the teams to do the self-service training and validate the effectiveness with a questionnaire solution or deliver the training themselves. - -### 5. Conclusion - -Security doesn't have to be hard. By following well established guidelines and using well known solutions an organisation can achieve a good level of security without too much resource allocation. - -Below is a diagram summarising tools used at each stage of development. - -![Tools Summary](images/summary.png "Tools Summary") From cf1aa3e35e0f82417721422a8a48fdd810bc6ed3 Mon Sep 17 00:00:00 2001 From: Simon Bennetts Date: Wed, 3 Jun 2020 10:46:41 +0100 Subject: [PATCH 04/11] Change ZAProxy to ZAP We either use Zed Attack Proxy or ZAP in literature. We do use `zaproxy` for account names but thats because `zap` is often already taken. --- writeups/owasp_in_sdlc/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/writeups/owasp_in_sdlc/index.md b/writeups/owasp_in_sdlc/index.md index 6d340cd6f..d3fe53439 100644 --- a/writeups/owasp_in_sdlc/index.md +++ b/writeups/owasp_in_sdlc/index.md @@ -143,9 +143,9 @@ Testing can be performed several ways and it highly depends on the nature of the If available, automation is a good idea as it allows detection of easy to find vulnerabilities without much human interaction. -If the application communicates using a web-based protocol, the [ZAProxy](https://github.com/zaproxy/zaproxy) project can be used to automate a great number of web related attacks and detection. ZAP can be orchestrated using its REST API and it can even automate multi-stage attacks by leveraging its Zest scripting support. +If the application communicates using a web-based protocol, the [ZAP](https://github.com/zaproxy/zaproxy) project can be used to automate a great number of web related attacks and detection. ZAP can be orchestrated using its REST API and it can even automate multi-stage attacks by leveraging its Zest scripting support. -Vulnerabilities from ZAProxy and a wide variety of other tools can be imported and managed using a dedicated defect management platform such as [Defect Dojo](https://github.com/DefectDojo/django-DefectDojo)(screenshot below). +Vulnerabilities from ZAP and a wide variety of other tools can be imported and managed using a dedicated defect management platform such as [Defect Dojo](https://github.com/DefectDojo/django-DefectDojo)(screenshot below). ![Defect Dojo](images/defectdojo.png "Defect Dojo") From 7a5f9f0b6f70c36647d39269fe15e62d83fdb42f Mon Sep 17 00:00:00 2001 From: Elie Saad Date: Wed, 3 Jun 2020 23:04:42 +0300 Subject: [PATCH 05/11] chore: redirection, titles, spacing --- _config.yml | 4 ++-- index.md | 2 +- writeups/owasp_in_sdlc/index.md | 4 +++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/_config.yml b/_config.yml index 80d48c9d0..d32525789 100644 --- a/_config.yml +++ b/_config.yml @@ -1,4 +1,4 @@ remote_theme: "owasp/www--site-theme" plugins: - - jekyll-include-cache-0.2.0 - - jekyll-redirect-from \ No newline at end of file + - jekyll-include-cache-0.2.0 + - jekyll-redirect-from diff --git a/index.md b/index.md index 8d631b0b8..4ad5a6bbd 100644 --- a/index.md +++ b/index.md @@ -25,6 +25,6 @@ The below is a rough estimation as it is dependent on other projects' time and a The roadmap will be adjusted as the project moves forward. -## OWASP In the SDLC +## OWASP in the SDLC In an effort to provide a high level map of how OWASP's projects link to the SDLC, a document detailing [OWASP in the SDLC](writeups/owasp_in_sdlc/owasp_in_sdlc.md) diff --git a/writeups/owasp_in_sdlc/index.md b/writeups/owasp_in_sdlc/index.md index d3fe53439..cc2ed6660 100644 --- a/writeups/owasp_in_sdlc/index.md +++ b/writeups/owasp_in_sdlc/index.md @@ -3,7 +3,9 @@ title: OWASP in SDLC layout: col-document tags: SDLC standards integration document: integration standards -redirection_from: "/writeups/owasp_in_sdlc/owasp_in_sdlc.html" +redirection_from: + - "/writeups/owasp_in_sdlc/owasp_in_sdlc.html" + - "/writeups/owasp_in_sdlc/owasp_in_sdlc" --- ## OWASP Application Security Fragmentation From 5b21f480df9d08bb1a80514aa94070b08cd37037 Mon Sep 17 00:00:00 2001 From: ThunderSon <32433575+ThunderSon@users.noreply.github.com> Date: Thu, 4 Jun 2020 09:50:38 +0300 Subject: [PATCH 06/11] fix redirection --- writeups/owasp_in_sdlc/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/writeups/owasp_in_sdlc/index.md b/writeups/owasp_in_sdlc/index.md index cc2ed6660..95832e57c 100644 --- a/writeups/owasp_in_sdlc/index.md +++ b/writeups/owasp_in_sdlc/index.md @@ -3,7 +3,7 @@ title: OWASP in SDLC layout: col-document tags: SDLC standards integration document: integration standards -redirection_from: +redirect_from: - "/writeups/owasp_in_sdlc/owasp_in_sdlc.html" - "/writeups/owasp_in_sdlc/owasp_in_sdlc" --- From c368dda9896a1295a884acd4e5c4b1c4dabca504 Mon Sep 17 00:00:00 2001 From: Spyros Date: Sat, 7 Nov 2020 18:18:02 +0000 Subject: [PATCH 07/11] cre_sync_2020-11-07T18.16.32.207374-test working copy (#7) script fixes * chore: add md redirection * new deps and todo list update * improvements Co-authored-by: ThunderSon <32433575+ThunderSon@users.noreply.github.com> --- index.md | 2 +- writeups/owasp_in_sdlc/index.md | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/index.md b/index.md index 4ad5a6bbd..f7b8a7e9c 100644 --- a/index.md +++ b/index.md @@ -27,4 +27,4 @@ The roadmap will be adjusted as the project moves forward. ## OWASP in the SDLC -In an effort to provide a high level map of how OWASP's projects link to the SDLC, a document detailing [OWASP in the SDLC](writeups/owasp_in_sdlc/owasp_in_sdlc.md) +In an effort to provide a high level map of how OWASP's projects link to the SDLC, a document detailing [OWASP in the SDLC](writeups/owasp_in_sdlc/) diff --git a/writeups/owasp_in_sdlc/index.md b/writeups/owasp_in_sdlc/index.md index 95832e57c..df2647893 100644 --- a/writeups/owasp_in_sdlc/index.md +++ b/writeups/owasp_in_sdlc/index.md @@ -5,6 +5,7 @@ tags: SDLC standards integration document: integration standards redirect_from: - "/writeups/owasp_in_sdlc/owasp_in_sdlc.html" + - "/writeups/owasp_in_sdlc/owasp_in_sdlc.md" - "/writeups/owasp_in_sdlc/owasp_in_sdlc" --- From 5d33f75141a96a30e0c522ef12cc97fb2eb071a7 Mon Sep 17 00:00:00 2001 From: Spyros Date: Mon, 9 Nov 2020 19:52:36 +0000 Subject: [PATCH 08/11] Spreadsheet sync (#9) * chore: fix SDLC writeup link * chore: add md redirection * links_in_sdlc_pic (#21) * links_in_sdlc_pic added links to the sdlc diagram * rename with underscores * Update SDLC_in_OWASP_links.html address comments * Merge Latest round of comments Changed colors and fonts to match owasp.org header and sidebar template SAMM, ASVS and mASVS are now party of "Culture Building & Process Maturing" * Update SDLC_in_OWASP_links.html address latest comments * Final touches based on feedback Co-authored-by: ThunderSon <32433575+ThunderSon@users.noreply.github.com> * Add the WayFinder Diagram (#23) * feat: add the wayfinder diagram * chore: fix HTML tags * chore: make the width smaller * Updated project level to incubator (2) * new deps and todo list update * cre_sync_2020-10-31T20.30.02.961745 (#1) * experiment on syncing working spreadsheet to github as yaml * mv cre_sync to dedicated repo * changes * cre_sync_2020-10-31T20.30.02.961745 * cre_sync_2020-11-07T18.16.32.207374-test working copy (#7) script fixes * chore: add md redirection * new deps and todo list update * improvements Co-authored-by: ThunderSon <32433575+ThunderSon@users.noreply.github.com> * added todo and implemented adding pull requests only when there are changes * latest script improvements -- github action * Update sync.yml fixing the known_hosts issue (hopefully) * make action run on midnight Co-authored-by: ThunderSon <32433575+ThunderSon@users.noreply.github.com> Co-authored-by: hblankenship <36673698+hblankenship@users.noreply.github.com> --- cres/venv/bin/activate | 84 + cres/venv/bin/activate.csh | 55 + cres/venv/bin/activate.fish | 100 + cres/venv/bin/activate.ps1 | 60 + cres/venv/bin/activate.xsh | 46 + cres/venv/bin/activate_this.py | 32 + cres/venv/bin/chardetect | 8 + cres/venv/bin/chardetect-3.8 | 8 + cres/venv/bin/chardetect3 | 8 + cres/venv/bin/distro | 8 + cres/venv/bin/distro-3.8 | 8 + cres/venv/bin/distro3 | 8 + cres/venv/bin/easy_install | 8 + cres/venv/bin/easy_install-3.8 | 8 + cres/venv/bin/easy_install3 | 8 + cres/venv/bin/pip | 8 + cres/venv/bin/pip-3.8 | 8 + cres/venv/bin/pip3 | 8 + cres/venv/bin/pip3.8 | 8 + cres/venv/bin/python | 1 + cres/venv/bin/python3 | 1 + cres/venv/bin/python3.8 | 1 + cres/venv/bin/wheel | 8 + cres/venv/bin/wheel-3.8 | 8 + cres/venv/bin/wheel3 | 8 + .../CacheControl-0.12.6.dist-info/AUTHORS.txt | 562 ++ .../CacheControl-0.12.6.dist-info/INSTALLER | 1 + .../CacheControl-0.12.6.dist-info/LICENSE.txt | 20 + .../CacheControl-0.12.6.dist-info/METADATA | 71 + .../CacheControl-0.12.6.dist-info/RECORD | 37 + .../CacheControl-0.12.6.dist-info/WHEEL | 6 + .../top_level.txt | 1 + .../CacheControl-0.12.6.virtualenv | 0 .../PyYAML-5.3.1.dist-info/INSTALLER | 1 + .../PyYAML-5.3.1.dist-info/LICENSE | 20 + .../PyYAML-5.3.1.dist-info/METADATA | 41 + .../PyYAML-5.3.1.dist-info/RECORD | 40 + .../PyYAML-5.3.1.dist-info/WHEEL | 5 + .../PyYAML-5.3.1.dist-info/top_level.txt | 2 + .../__pycache__/_virtualenv.cpython-38.pyc | Bin 0 -> 3998 bytes .../__pycache__/appdirs.cpython-38.pyc | Bin 0 -> 20549 bytes .../__pycache__/contextlib2.cpython-38.pyc | Bin 0 -> 15539 bytes .../__pycache__/distro.cpython-38.pyc | Bin 0 -> 36590 bytes .../__pycache__/pyparsing.cpython-38.pyc | Bin 0 -> 240361 bytes .../__pycache__/retrying.cpython-38.pyc | Bin 0 -> 8031 bytes .../__pycache__/six.cpython-38.pyc | Bin 0 -> 26913 bytes .../python3.8/site-packages/_virtualenv.pth | 1 + .../python3.8/site-packages/_virtualenv.py | 115 + .../appdirs-1.4.3.dist-info/AUTHORS.txt | 562 ++ .../appdirs-1.4.3.dist-info/INSTALLER | 1 + .../appdirs-1.4.3.dist-info/LICENSE.txt | 20 + .../appdirs-1.4.3.dist-info/METADATA | 256 + .../appdirs-1.4.3.dist-info/RECORD | 11 + .../appdirs-1.4.3.dist-info/WHEEL | 6 + .../appdirs-1.4.3.dist-info/top_level.txt | 1 + .../site-packages/appdirs-1.4.3.virtualenv | 0 .../lib/python3.8/site-packages/appdirs.py | 608 ++ .../site-packages/cachecontrol/__init__.py | 11 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 562 bytes .../__pycache__/adapter.cpython-38.pyc | Bin 0 -> 3084 bytes .../__pycache__/cache.cpython-38.pyc | Bin 0 -> 1795 bytes .../__pycache__/compat.cpython-38.pyc | Bin 0 -> 721 bytes .../__pycache__/controller.cpython-38.pyc | Bin 0 -> 7788 bytes .../__pycache__/filewrapper.cpython-38.pyc | Bin 0 -> 2188 bytes .../__pycache__/serialize.cpython-38.pyc | Bin 0 -> 4213 bytes .../__pycache__/wrapper.cpython-38.pyc | Bin 0 -> 686 bytes .../site-packages/cachecontrol/_cmd.py | 57 + .../site-packages/cachecontrol/adapter.py | 133 + .../site-packages/cachecontrol/cache.py | 39 + .../cachecontrol/caches/__init__.py | 2 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 306 bytes .../__pycache__/file_cache.cpython-38.pyc | Bin 0 -> 3280 bytes .../__pycache__/redis_cache.cpython-38.pyc | Bin 0 -> 1566 bytes .../cachecontrol/caches/file_cache.py | 146 + .../cachecontrol/caches/redis_cache.py | 33 + .../site-packages/cachecontrol/compat.py | 29 + .../site-packages/cachecontrol/controller.py | 376 + .../site-packages/cachecontrol/filewrapper.py | 80 + .../site-packages/cachecontrol/heuristics.py | 135 + .../site-packages/cachecontrol/serialize.py | 188 + .../site-packages/cachecontrol/wrapper.py | 29 + .../certifi-2019.11.28.dist-info/AUTHORS.txt | 562 ++ .../certifi-2019.11.28.dist-info/INSTALLER | 1 + .../certifi-2019.11.28.dist-info/LICENSE.txt | 20 + .../certifi-2019.11.28.dist-info/METADATA | 74 + .../certifi-2019.11.28.dist-info/RECORD | 17 + .../certifi-2019.11.28.dist-info/WHEEL | 6 + .../top_level.txt | 1 + .../certifi-2019.11.28.virtualenv | 0 .../site-packages/certifi/__init__.py | 3 + .../site-packages/certifi/__main__.py | 2 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 269 bytes .../certifi/__pycache__/core.cpython-38.pyc | Bin 0 -> 493 bytes .../site-packages/certifi/cacert.pem | 4602 +++++++++ .../python3.8/site-packages/certifi/core.py | 15 + .../chardet-3.0.4.dist-info/AUTHORS.txt | 562 ++ .../chardet-3.0.4.dist-info/INSTALLER | 1 + .../chardet-3.0.4.dist-info/LICENSE.txt | 20 + .../chardet-3.0.4.dist-info/METADATA | 98 + .../chardet-3.0.4.dist-info/RECORD | 97 + .../chardet-3.0.4.dist-info/WHEEL | 6 + .../chardet-3.0.4.dist-info/entry_points.txt | 3 + .../chardet-3.0.4.dist-info/top_level.txt | 1 + .../site-packages/chardet-3.0.4.virtualenv | 0 .../site-packages/chardet/__init__.py | 39 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 862 bytes .../__pycache__/big5freq.cpython-38.pyc | Bin 0 -> 27191 bytes .../__pycache__/big5prober.cpython-38.pyc | Bin 0 -> 1146 bytes .../chardistribution.cpython-38.pyc | Bin 0 -> 6232 bytes .../charsetgroupprober.cpython-38.pyc | Bin 0 -> 2263 bytes .../__pycache__/charsetprober.cpython-38.pyc | Bin 0 -> 3495 bytes .../codingstatemachine.cpython-38.pyc | Bin 0 -> 2922 bytes .../chardet/__pycache__/compat.cpython-38.pyc | Bin 0 -> 367 bytes .../__pycache__/cp949prober.cpython-38.pyc | Bin 0 -> 1153 bytes .../chardet/__pycache__/enums.cpython-38.pyc | Bin 0 -> 2660 bytes .../__pycache__/escprober.cpython-38.pyc | Bin 0 -> 2645 bytes .../chardet/__pycache__/escsm.cpython-38.pyc | Bin 0 -> 7486 bytes .../__pycache__/eucjpprober.cpython-38.pyc | Bin 0 -> 2463 bytes .../__pycache__/euckrfreq.cpython-38.pyc | Bin 0 -> 12075 bytes .../__pycache__/euckrprober.cpython-38.pyc | Bin 0 -> 1154 bytes .../__pycache__/euctwfreq.cpython-38.pyc | Bin 0 -> 27195 bytes .../__pycache__/euctwprober.cpython-38.pyc | Bin 0 -> 1154 bytes .../__pycache__/gb2312freq.cpython-38.pyc | Bin 0 -> 19119 bytes .../__pycache__/gb2312prober.cpython-38.pyc | Bin 0 -> 1162 bytes .../__pycache__/hebrewprober.cpython-38.pyc | Bin 0 -> 3035 bytes .../__pycache__/jisfreq.cpython-38.pyc | Bin 0 -> 22147 bytes .../chardet/__pycache__/jpcntx.cpython-38.pyc | Bin 0 -> 37620 bytes .../langbulgarianmodel.cpython-38.pyc | Bin 0 -> 23644 bytes .../langcyrillicmodel.cpython-38.pyc | Bin 0 -> 29108 bytes .../__pycache__/langgreekmodel.cpython-38.pyc | Bin 0 -> 23602 bytes .../langhebrewmodel.cpython-38.pyc | Bin 0 -> 22229 bytes .../__pycache__/langthaimodel.cpython-38.pyc | Bin 0 -> 22208 bytes .../langturkishmodel.cpython-38.pyc | Bin 0 -> 22231 bytes .../__pycache__/latin1prober.cpython-38.pyc | Bin 0 -> 3415 bytes .../mbcharsetprober.cpython-38.pyc | Bin 0 -> 2278 bytes .../mbcsgroupprober.cpython-38.pyc | Bin 0 -> 1143 bytes .../chardet/__pycache__/mbcssm.cpython-38.pyc | Bin 0 -> 16766 bytes .../sbcharsetprober.cpython-38.pyc | Bin 0 -> 3031 bytes .../sbcsgroupprober.cpython-38.pyc | Bin 0 -> 1641 bytes .../__pycache__/sjisprober.cpython-38.pyc | Bin 0 -> 2499 bytes .../universaldetector.cpython-38.pyc | Bin 0 -> 5843 bytes .../__pycache__/utf8prober.cpython-38.pyc | Bin 0 -> 2004 bytes .../__pycache__/version.cpython-38.pyc | Bin 0 -> 451 bytes .../site-packages/chardet/big5freq.py | 386 + .../site-packages/chardet/big5prober.py | 47 + .../site-packages/chardet/chardistribution.py | 233 + .../chardet/charsetgroupprober.py | 106 + .../site-packages/chardet/charsetprober.py | 145 + .../site-packages/chardet/cli/__init__.py | 1 + .../site-packages/chardet/cli/chardetect.py | 85 + .../chardet/codingstatemachine.py | 88 + .../python3.8/site-packages/chardet/compat.py | 34 + .../site-packages/chardet/cp949prober.py | 49 + .../python3.8/site-packages/chardet/enums.py | 76 + .../site-packages/chardet/escprober.py | 101 + .../python3.8/site-packages/chardet/escsm.py | 246 + .../site-packages/chardet/eucjpprober.py | 92 + .../site-packages/chardet/euckrfreq.py | 195 + .../site-packages/chardet/euckrprober.py | 47 + .../site-packages/chardet/euctwfreq.py | 387 + .../site-packages/chardet/euctwprober.py | 46 + .../site-packages/chardet/gb2312freq.py | 283 + .../site-packages/chardet/gb2312prober.py | 46 + .../site-packages/chardet/hebrewprober.py | 292 + .../site-packages/chardet/jisfreq.py | 325 + .../python3.8/site-packages/chardet/jpcntx.py | 233 + .../chardet/langbulgarianmodel.py | 228 + .../chardet/langcyrillicmodel.py | 333 + .../site-packages/chardet/langgreekmodel.py | 225 + .../site-packages/chardet/langhebrewmodel.py | 200 + .../chardet/langhungarianmodel.py | 225 + .../site-packages/chardet/langthaimodel.py | 199 + .../site-packages/chardet/langturkishmodel.py | 193 + .../site-packages/chardet/latin1prober.py | 145 + .../site-packages/chardet/mbcharsetprober.py | 91 + .../site-packages/chardet/mbcsgroupprober.py | 54 + .../python3.8/site-packages/chardet/mbcssm.py | 572 ++ .../site-packages/chardet/sbcharsetprober.py | 132 + .../site-packages/chardet/sbcsgroupprober.py | 73 + .../site-packages/chardet/sjisprober.py | 92 + .../chardet/universaldetector.py | 286 + .../site-packages/chardet/utf8prober.py | 82 + .../site-packages/chardet/version.py | 9 + .../colorama-0.4.3.dist-info/AUTHORS.txt | 562 ++ .../colorama-0.4.3.dist-info/INSTALLER | 1 + .../colorama-0.4.3.dist-info/LICENSE.txt | 20 + .../colorama-0.4.3.dist-info/METADATA | 411 + .../colorama-0.4.3.dist-info/RECORD | 22 + .../colorama-0.4.3.dist-info/WHEEL | 6 + .../colorama-0.4.3.dist-info/top_level.txt | 1 + .../site-packages/colorama-0.4.3.virtualenv | 0 .../site-packages/colorama/__init__.py | 6 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 456 bytes .../colorama/__pycache__/ansi.cpython-38.pyc | Bin 0 -> 3241 bytes .../__pycache__/ansitowin32.cpython-38.pyc | Bin 0 -> 7750 bytes .../__pycache__/initialise.cpython-38.pyc | Bin 0 -> 1717 bytes .../colorama/__pycache__/win32.cpython-38.pyc | Bin 0 -> 3993 bytes .../__pycache__/winterm.cpython-38.pyc | Bin 0 -> 4677 bytes .../python3.8/site-packages/colorama/ansi.py | 102 + .../site-packages/colorama/ansitowin32.py | 257 + .../site-packages/colorama/initialise.py | 80 + .../python3.8/site-packages/colorama/win32.py | 152 + .../site-packages/colorama/winterm.py | 169 + .../contextlib2-0.6.0.dist-info/AUTHORS.txt | 562 ++ .../contextlib2-0.6.0.dist-info/INSTALLER | 1 + .../contextlib2-0.6.0.dist-info/LICENSE.txt | 20 + .../contextlib2-0.6.0.dist-info/METADATA | 70 + .../contextlib2-0.6.0.dist-info/RECORD | 11 + .../contextlib2-0.6.0.dist-info/WHEEL | 6 + .../contextlib2-0.6.0.dist-info/top_level.txt | 1 + .../contextlib2-0.6.0.virtualenv | 0 .../python3.8/site-packages/contextlib2.py | 518 ++ .../distlib-0.3.0.dist-info/AUTHORS.txt | 562 ++ .../distlib-0.3.0.dist-info/INSTALLER | 1 + .../distlib-0.3.0.dist-info/LICENSE.txt | 20 + .../distlib-0.3.0.dist-info/METADATA | 31 + .../distlib-0.3.0.dist-info/RECORD | 48 + .../distlib-0.3.0.dist-info/WHEEL | 6 + .../distlib-0.3.0.dist-info/top_level.txt | 1 + .../site-packages/distlib-0.3.0.virtualenv | 0 .../site-packages/distlib/__init__.py | 23 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 1071 bytes .../distlib/__pycache__/compat.cpython-38.pyc | Bin 0 -> 32220 bytes .../__pycache__/resources.cpython-38.pyc | Bin 0 -> 11021 bytes .../__pycache__/scripts.cpython-38.pyc | Bin 0 -> 10886 bytes .../distlib/__pycache__/util.cpython-38.pyc | Bin 0 -> 48174 bytes .../distlib/_backport/__init__.py | 6 + .../site-packages/distlib/_backport/misc.py | 41 + .../site-packages/distlib/_backport/shutil.py | 761 ++ .../distlib/_backport/sysconfig.cfg | 84 + .../distlib/_backport/sysconfig.py | 786 ++ .../distlib/_backport/tarfile.py | 2607 ++++++ .../python3.8/site-packages/distlib/compat.py | 1120 +++ .../site-packages/distlib/database.py | 1339 +++ .../python3.8/site-packages/distlib/index.py | 516 ++ .../site-packages/distlib/locators.py | 1302 +++ .../site-packages/distlib/manifest.py | 393 + .../site-packages/distlib/markers.py | 131 + .../site-packages/distlib/metadata.py | 1096 +++ .../site-packages/distlib/resources.py | 355 + .../site-packages/distlib/scripts.py | 416 + .../python3.8/site-packages/distlib/util.py | 1761 ++++ .../site-packages/distlib/version.py | 736 ++ .../python3.8/site-packages/distlib/wheel.py | 1004 ++ .../distro-1.4.0.dist-info/AUTHORS.txt | 562 ++ .../distro-1.4.0.dist-info/INSTALLER | 1 + .../distro-1.4.0.dist-info/LICENSE.txt | 20 + .../distro-1.4.0.dist-info/METADATA | 170 + .../distro-1.4.0.dist-info/RECORD | 15 + .../distro-1.4.0.dist-info/WHEEL | 6 + .../distro-1.4.0.dist-info/entry_points.txt | 3 + .../distro-1.4.0.dist-info/top_level.txt | 1 + .../site-packages/distro-1.4.0.virtualenv | 0 .../lib/python3.8/site-packages/distro.py | 1216 +++ .../python3.8/site-packages/easy_install.py | 5 + .../html5lib-1.0.1.dist-info/AUTHORS.txt | 562 ++ .../html5lib-1.0.1.dist-info/INSTALLER | 1 + .../html5lib-1.0.1.dist-info/LICENSE.txt | 20 + .../html5lib-1.0.1.dist-info/METADATA | 526 ++ .../html5lib-1.0.1.dist-info/RECORD | 83 + .../html5lib-1.0.1.dist-info/WHEEL | 6 + .../html5lib-1.0.1.dist-info/top_level.txt | 1 + .../site-packages/html5lib-1.0.1.virtualenv | 0 .../site-packages/html5lib/__init__.py | 35 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 1312 bytes .../__pycache__/_ihatexml.cpython-38.pyc | Bin 0 -> 13801 bytes .../__pycache__/_inputstream.cpython-38.pyc | Bin 0 -> 21893 bytes .../__pycache__/_tokenizer.cpython-38.pyc | Bin 0 -> 39659 bytes .../__pycache__/_utils.cpython-38.pyc | Bin 0 -> 3347 bytes .../__pycache__/constants.cpython-38.pyc | Bin 0 -> 66366 bytes .../__pycache__/html5parser.cpython-38.pyc | Bin 0 -> 95176 bytes .../__pycache__/serializer.cpython-38.pyc | Bin 0 -> 10825 bytes .../site-packages/html5lib/_ihatexml.py | 288 + .../site-packages/html5lib/_inputstream.py | 923 ++ .../site-packages/html5lib/_tokenizer.py | 1721 ++++ .../site-packages/html5lib/_trie/__init__.py | 14 + .../_trie/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 438 bytes .../_trie/__pycache__/_base.cpython-38.pyc | Bin 0 -> 1543 bytes .../_trie/__pycache__/datrie.cpython-38.pyc | Bin 0 -> 2038 bytes .../_trie/__pycache__/py.cpython-38.pyc | Bin 0 -> 2262 bytes .../site-packages/html5lib/_trie/_base.py | 37 + .../site-packages/html5lib/_trie/datrie.py | 44 + .../site-packages/html5lib/_trie/py.py | 67 + .../site-packages/html5lib/_utils.py | 124 + .../site-packages/html5lib/constants.py | 2947 ++++++ .../html5lib/filters/__init__.py | 0 .../filters/alphabeticalattributes.py | 29 + .../site-packages/html5lib/filters/base.py | 12 + .../html5lib/filters/inject_meta_charset.py | 73 + .../site-packages/html5lib/filters/lint.py | 93 + .../html5lib/filters/optionaltags.py | 207 + .../html5lib/filters/sanitizer.py | 896 ++ .../html5lib/filters/whitespace.py | 38 + .../site-packages/html5lib/html5parser.py | 2791 ++++++ .../site-packages/html5lib/serializer.py | 409 + .../html5lib/treeadapters/__init__.py | 30 + .../html5lib/treeadapters/genshi.py | 54 + .../html5lib/treeadapters/sax.py | 50 + .../html5lib/treebuilders/__init__.py | 88 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 3337 bytes .../__pycache__/base.cpython-38.pyc | Bin 0 -> 11351 bytes .../__pycache__/etree.cpython-38.pyc | Bin 0 -> 11845 bytes .../html5lib/treebuilders/base.py | 417 + .../html5lib/treebuilders/dom.py | 236 + .../html5lib/treebuilders/etree.py | 340 + .../html5lib/treebuilders/etree_lxml.py | 366 + .../html5lib/treewalkers/__init__.py | 154 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 4018 bytes .../html5lib/treewalkers/base.py | 252 + .../site-packages/html5lib/treewalkers/dom.py | 43 + .../html5lib/treewalkers/etree.py | 130 + .../html5lib/treewalkers/etree_lxml.py | 213 + .../html5lib/treewalkers/genshi.py | 69 + .../idna-2.8.dist-info/AUTHORS.txt | 562 ++ .../idna-2.8.dist-info/INSTALLER | 1 + .../idna-2.8.dist-info/LICENSE.txt | 20 + .../site-packages/idna-2.8.dist-info/METADATA | 239 + .../site-packages/idna-2.8.dist-info/RECORD | 26 + .../site-packages/idna-2.8.dist-info/WHEEL | 6 + .../idna-2.8.dist-info/top_level.txt | 1 + .../site-packages/idna-2.8.virtualenv | 0 .../python3.8/site-packages/idna/__init__.py | 2 + .../idna/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 270 bytes .../idna/__pycache__/core.cpython-38.pyc | Bin 0 -> 9058 bytes .../idna/__pycache__/idnadata.cpython-38.pyc | Bin 0 -> 21394 bytes .../idna/__pycache__/intranges.cpython-38.pyc | Bin 0 -> 1822 bytes .../__pycache__/package_data.cpython-38.pyc | Bin 0 -> 224 bytes .../lib/python3.8/site-packages/idna/codec.py | 118 + .../python3.8/site-packages/idna/compat.py | 12 + .../lib/python3.8/site-packages/idna/core.py | 396 + .../python3.8/site-packages/idna/idnadata.py | 1979 ++++ .../python3.8/site-packages/idna/intranges.py | 53 + .../site-packages/idna/package_data.py | 2 + .../python3.8/site-packages/idna/uts46data.py | 8205 +++++++++++++++++ .../ipaddr-2.2.0.dist-info/AUTHORS.txt | 562 ++ .../ipaddr-2.2.0.dist-info/INSTALLER | 1 + .../ipaddr-2.2.0.dist-info/LICENSE.txt | 20 + .../ipaddr-2.2.0.dist-info/METADATA | 25 + .../ipaddr-2.2.0.dist-info/RECORD | 11 + .../ipaddr-2.2.0.dist-info/WHEEL | 6 + .../ipaddr-2.2.0.dist-info/top_level.txt | 1 + .../site-packages/ipaddr-2.2.0.virtualenv | 0 .../lib/python3.8/site-packages/ipaddr.py | 1928 ++++ .../lockfile-0.12.2.dist-info/AUTHORS.txt | 562 ++ .../lockfile-0.12.2.dist-info/INSTALLER | 1 + .../lockfile-0.12.2.dist-info/LICENSE.txt | 20 + .../lockfile-0.12.2.dist-info/METADATA | 58 + .../lockfile-0.12.2.dist-info/RECORD | 23 + .../lockfile-0.12.2.dist-info/WHEEL | 6 + .../lockfile-0.12.2.dist-info/pbr.json | 1 + .../lockfile-0.12.2.dist-info/top_level.txt | 1 + .../site-packages/lockfile-0.12.2.virtualenv | 0 .../site-packages/lockfile/__init__.py | 347 + .../site-packages/lockfile/linklockfile.py | 73 + .../site-packages/lockfile/mkdirlockfile.py | 84 + .../site-packages/lockfile/pidlockfile.py | 190 + .../site-packages/lockfile/sqlitelockfile.py | 156 + .../site-packages/lockfile/symlinklockfile.py | 70 + .../msgpack-0.6.2.dist-info/AUTHORS.txt | 562 ++ .../msgpack-0.6.2.dist-info/INSTALLER | 1 + .../msgpack-0.6.2.dist-info/LICENSE.txt | 20 + .../msgpack-0.6.2.dist-info/METADATA | 362 + .../msgpack-0.6.2.dist-info/RECORD | 19 + .../msgpack-0.6.2.dist-info/WHEEL | 6 + .../msgpack-0.6.2.dist-info/top_level.txt | 1 + .../site-packages/msgpack-0.6.2.virtualenv | 0 .../site-packages/msgpack/__init__.py | 65 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 1967 bytes .../__pycache__/_version.cpython-38.pyc | Bin 0 -> 231 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 0 -> 1865 bytes .../_cmsgpack.cpython-38-x86_64-linux-gnu.so | Bin 0 -> 163216 bytes .../site-packages/msgpack/_version.py | 1 + .../site-packages/msgpack/exceptions.py | 48 + .../site-packages/msgpack/fallback.py | 1027 +++ .../packaging-20.3.dist-info/AUTHORS.txt | 562 ++ .../packaging-20.3.dist-info/INSTALLER | 1 + .../packaging-20.3.dist-info/LICENSE.txt | 20 + .../packaging-20.3.dist-info/METADATA | 362 + .../packaging-20.3.dist-info/RECORD | 33 + .../packaging-20.3.dist-info/WHEEL | 6 + .../packaging-20.3.dist-info/top_level.txt | 1 + .../site-packages/packaging-20.3.virtualenv | 0 .../site-packages/packaging/__about__.py | 27 + .../site-packages/packaging/__init__.py | 26 + .../__pycache__/__about__.cpython-38.pyc | Bin 0 -> 746 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 584 bytes .../__pycache__/_compat.cpython-38.pyc | Bin 0 -> 1161 bytes .../__pycache__/_structures.cpython-38.pyc | Bin 0 -> 2910 bytes .../__pycache__/_typing.cpython-38.pyc | Bin 0 -> 1489 bytes .../__pycache__/markers.cpython-38.pyc | Bin 0 -> 9329 bytes .../__pycache__/requirements.cpython-38.pyc | Bin 0 -> 4092 bytes .../__pycache__/specifiers.cpython-38.pyc | Bin 0 -> 20339 bytes .../packaging/__pycache__/tags.cpython-38.pyc | Bin 0 -> 16913 bytes .../__pycache__/utils.cpython-38.pyc | Bin 0 -> 1578 bytes .../__pycache__/version.cpython-38.pyc | Bin 0 -> 13353 bytes .../site-packages/packaging/_compat.py | 38 + .../site-packages/packaging/_structures.py | 86 + .../site-packages/packaging/_typing.py | 39 + .../site-packages/packaging/markers.py | 328 + .../site-packages/packaging/py.typed | 0 .../site-packages/packaging/requirements.py | 145 + .../site-packages/packaging/specifiers.py | 849 ++ .../python3.8/site-packages/packaging/tags.py | 739 ++ .../site-packages/packaging/utils.py | 62 + .../site-packages/packaging/version.py | 535 ++ .../pep517-0.8.2.dist-info/AUTHORS.txt | 562 ++ .../pep517-0.8.2.dist-info/INSTALLER | 1 + .../pep517-0.8.2.dist-info/LICENSE.txt | 20 + .../pep517-0.8.2.dist-info/METADATA | 15 + .../pep517-0.8.2.dist-info/RECORD | 30 + .../pep517-0.8.2.dist-info/WHEEL | 6 + .../pep517-0.8.2.dist-info/top_level.txt | 1 + .../site-packages/pep517-0.8.2.virtualenv | 0 .../site-packages/pep517/__init__.py | 4 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 295 bytes .../pep517/__pycache__/compat.cpython-38.pyc | Bin 0 -> 1062 bytes .../__pycache__/wrappers.cpython-38.pyc | Bin 0 -> 10561 bytes .../site-packages/pep517/_in_process.py | 280 + .../python3.8/site-packages/pep517/build.py | 124 + .../python3.8/site-packages/pep517/check.py | 203 + .../site-packages/pep517/colorlog.py | 115 + .../python3.8/site-packages/pep517/compat.py | 34 + .../site-packages/pep517/dirtools.py | 44 + .../site-packages/pep517/envbuild.py | 167 + .../python3.8/site-packages/pep517/meta.py | 92 + .../site-packages/pep517/wrappers.py | 308 + .../pip-20.0.2.dist-info/INSTALLER | 1 + .../pip-20.0.2.dist-info/LICENSE.txt | 20 + .../pip-20.0.2.dist-info/METADATA | 84 + .../site-packages/pip-20.0.2.dist-info/RECORD | 264 + .../site-packages/pip-20.0.2.dist-info/WHEEL | 6 + .../pip-20.0.2.dist-info/entry_points.txt | 5 + .../pip-20.0.2.dist-info/top_level.txt | 1 + .../site-packages/pip-20.0.2.virtualenv | 0 .../python3.8/site-packages/pip/__init__.py | 18 + .../python3.8/site-packages/pip/__main__.py | 19 + .../pip/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 690 bytes .../site-packages/pip/_internal/__init__.py | 18 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 739 bytes .../__pycache__/build_env.cpython-38.pyc | Bin 0 -> 7544 bytes .../__pycache__/cache.cpython-38.pyc | Bin 0 -> 8761 bytes .../__pycache__/configuration.cpython-38.pyc | Bin 0 -> 10706 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 0 -> 12543 bytes .../__pycache__/legacy_resolve.cpython-38.pyc | Bin 0 -> 9959 bytes .../__pycache__/locations.cpython-38.pyc | Bin 0 -> 4553 bytes .../__pycache__/pep425tags.cpython-38.pyc | Bin 0 -> 3645 bytes .../__pycache__/pyproject.cpython-38.pyc | Bin 0 -> 3795 bytes .../self_outdated_check.cpython-38.pyc | Bin 0 -> 5554 bytes .../__pycache__/wheel_builder.cpython-38.pyc | Bin 0 -> 6760 bytes .../site-packages/pip/_internal/build_env.py | 221 + .../site-packages/pip/_internal/cache.py | 329 + .../pip/_internal/cli/__init__.py | 4 + .../cli/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 297 bytes .../__pycache__/autocompletion.cpython-38.pyc | Bin 0 -> 5014 bytes .../__pycache__/base_command.cpython-38.pyc | Bin 0 -> 5908 bytes .../cli/__pycache__/cmdoptions.cpython-38.pyc | Bin 0 -> 20389 bytes .../command_context.cpython-38.pyc | Bin 0 -> 1372 bytes .../cli/__pycache__/main.cpython-38.pyc | Bin 0 -> 1467 bytes .../__pycache__/main_parser.cpython-38.pyc | Bin 0 -> 2220 bytes .../cli/__pycache__/parser.cpython-38.pyc | Bin 0 -> 9038 bytes .../__pycache__/req_command.cpython-38.pyc | Bin 0 -> 8350 bytes .../__pycache__/status_codes.cpython-38.pyc | Bin 0 -> 426 bytes .../pip/_internal/cli/autocompletion.py | 164 + .../pip/_internal/cli/base_command.py | 226 + .../pip/_internal/cli/cmdoptions.py | 957 ++ .../pip/_internal/cli/command_context.py | 36 + .../site-packages/pip/_internal/cli/main.py | 75 + .../pip/_internal/cli/main_parser.py | 99 + .../site-packages/pip/_internal/cli/parser.py | 265 + .../pip/_internal/cli/req_command.py | 333 + .../pip/_internal/cli/status_codes.py | 8 + .../pip/_internal/commands/__init__.py | 114 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 2913 bytes .../__pycache__/install.cpython-38.pyc | Bin 0 -> 16722 bytes .../__pycache__/search.cpython-38.pyc | Bin 0 -> 4545 bytes .../pip/_internal/commands/check.py | 45 + .../pip/_internal/commands/completion.py | 96 + .../pip/_internal/commands/configuration.py | 233 + .../pip/_internal/commands/debug.py | 142 + .../pip/_internal/commands/download.py | 147 + .../pip/_internal/commands/freeze.py | 103 + .../pip/_internal/commands/hash.py | 58 + .../pip/_internal/commands/help.py | 41 + .../pip/_internal/commands/install.py | 727 ++ .../pip/_internal/commands/list.py | 315 + .../pip/_internal/commands/search.py | 145 + .../pip/_internal/commands/show.py | 180 + .../pip/_internal/commands/uninstall.py | 82 + .../pip/_internal/commands/wheel.py | 197 + .../pip/_internal/configuration.py | 422 + .../pip/_internal/distributions/__init__.py | 24 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 873 bytes .../__pycache__/base.cpython-38.pyc | Bin 0 -> 1989 bytes .../__pycache__/installed.cpython-38.pyc | Bin 0 -> 1269 bytes .../__pycache__/sdist.cpython-38.pyc | Bin 0 -> 3532 bytes .../__pycache__/wheel.cpython-38.pyc | Bin 0 -> 1621 bytes .../pip/_internal/distributions/base.py | 45 + .../pip/_internal/distributions/installed.py | 24 + .../pip/_internal/distributions/sdist.py | 104 + .../pip/_internal/distributions/wheel.py | 36 + .../site-packages/pip/_internal/exceptions.py | 308 + .../pip/_internal/index/__init__.py | 2 + .../index/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 251 bytes .../__pycache__/collector.cpython-38.pyc | Bin 0 -> 14217 bytes .../__pycache__/package_finder.cpython-38.pyc | Bin 0 -> 25810 bytes .../pip/_internal/index/collector.py | 544 ++ .../pip/_internal/index/package_finder.py | 1013 ++ .../pip/_internal/legacy_resolve.py | 430 + .../site-packages/pip/_internal/locations.py | 194 + .../site-packages/pip/_internal/main.py | 16 + .../pip/_internal/models/__init__.py | 2 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 285 bytes .../__pycache__/candidate.cpython-38.pyc | Bin 0 -> 1482 bytes .../__pycache__/format_control.cpython-38.pyc | Bin 0 -> 2477 bytes .../models/__pycache__/index.cpython-38.pyc | Bin 0 -> 1207 bytes .../models/__pycache__/link.cpython-38.pyc | Bin 0 -> 6720 bytes .../models/__pycache__/scheme.cpython-38.pyc | Bin 0 -> 923 bytes .../__pycache__/search_scope.cpython-38.pyc | Bin 0 -> 3314 bytes .../selection_prefs.cpython-38.pyc | Bin 0 -> 1657 bytes .../__pycache__/target_python.cpython-38.pyc | Bin 0 -> 3280 bytes .../models/__pycache__/wheel.cpython-38.pyc | Bin 0 -> 3243 bytes .../pip/_internal/models/candidate.py | 36 + .../pip/_internal/models/format_control.py | 84 + .../pip/_internal/models/index.py | 31 + .../pip/_internal/models/link.py | 227 + .../pip/_internal/models/scheme.py | 25 + .../pip/_internal/models/search_scope.py | 114 + .../pip/_internal/models/selection_prefs.py | 47 + .../pip/_internal/models/target_python.py | 107 + .../pip/_internal/models/wheel.py | 78 + .../pip/_internal/network/__init__.py | 2 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 273 bytes .../network/__pycache__/auth.cpython-38.pyc | Bin 0 -> 7039 bytes .../network/__pycache__/cache.cpython-38.pyc | Bin 0 -> 2752 bytes .../__pycache__/download.cpython-38.pyc | Bin 0 -> 4431 bytes .../__pycache__/session.cpython-38.pyc | Bin 0 -> 8912 bytes .../network/__pycache__/utils.cpython-38.pyc | Bin 0 -> 767 bytes .../network/__pycache__/xmlrpc.cpython-38.pyc | Bin 0 -> 1635 bytes .../pip/_internal/network/auth.py | 298 + .../pip/_internal/network/cache.py | 81 + .../pip/_internal/network/download.py | 200 + .../pip/_internal/network/session.py | 405 + .../pip/_internal/network/utils.py | 48 + .../pip/_internal/network/xmlrpc.py | 44 + .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 221 bytes .../__pycache__/check.cpython-38.pyc | Bin 0 -> 3717 bytes .../__pycache__/prepare.cpython-38.pyc | Bin 0 -> 11223 bytes .../_internal/operations/build/__init__.py | 0 .../build/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 227 bytes .../build/__pycache__/metadata.cpython-38.pyc | Bin 0 -> 1269 bytes .../metadata_legacy.cpython-38.pyc | Bin 0 -> 3329 bytes .../build/__pycache__/wheel.cpython-38.pyc | Bin 0 -> 1367 bytes .../__pycache__/wheel_legacy.cpython-38.pyc | Bin 0 -> 2628 bytes .../_internal/operations/build/metadata.py | 40 + .../operations/build/metadata_legacy.py | 122 + .../pip/_internal/operations/build/wheel.py | 46 + .../operations/build/wheel_legacy.py | 115 + .../pip/_internal/operations/check.py | 163 + .../pip/_internal/operations/freeze.py | 265 + .../_internal/operations/install/__init__.py | 2 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 285 bytes .../editable_legacy.cpython-38.pyc | Bin 0 -> 1363 bytes .../install/__pycache__/legacy.cpython-38.pyc | Bin 0 -> 3109 bytes .../install/__pycache__/wheel.cpython-38.pyc | Bin 0 -> 14643 bytes .../operations/install/editable_legacy.py | 52 + .../_internal/operations/install/legacy.py | 129 + .../pip/_internal/operations/install/wheel.py | 615 ++ .../pip/_internal/operations/prepare.py | 591 ++ .../site-packages/pip/_internal/pep425tags.py | 167 + .../site-packages/pip/_internal/pyproject.py | 196 + .../pip/_internal/req/__init__.py | 92 + .../req/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 2255 bytes .../__pycache__/constructors.cpython-38.pyc | Bin 0 -> 10424 bytes .../req/__pycache__/req_file.cpython-38.pyc | Bin 0 -> 12763 bytes .../__pycache__/req_install.cpython-38.pyc | Bin 0 -> 21399 bytes .../req/__pycache__/req_set.cpython-38.pyc | Bin 0 -> 6082 bytes .../__pycache__/req_tracker.cpython-38.pyc | Bin 0 -> 4102 bytes .../__pycache__/req_uninstall.cpython-38.pyc | Bin 0 -> 17488 bytes .../pip/_internal/req/constructors.py | 436 + .../pip/_internal/req/req_file.py | 546 ++ .../pip/_internal/req/req_install.py | 830 ++ .../pip/_internal/req/req_set.py | 209 + .../pip/_internal/req/req_tracker.py | 150 + .../pip/_internal/req/req_uninstall.py | 644 ++ .../pip/_internal/self_outdated_check.py | 242 + .../pip/_internal/utils/__init__.py | 0 .../utils/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 216 bytes .../utils/__pycache__/appdirs.cpython-38.pyc | Bin 0 -> 1400 bytes .../utils/__pycache__/compat.cpython-38.pyc | Bin 0 -> 6181 bytes .../__pycache__/deprecation.cpython-38.pyc | Bin 0 -> 2887 bytes .../__pycache__/distutils_args.cpython-38.pyc | Bin 0 -> 1200 bytes .../utils/__pycache__/encoding.cpython-38.pyc | Bin 0 -> 1308 bytes .../__pycache__/filesystem.cpython-38.pyc | Bin 0 -> 4096 bytes .../__pycache__/filetypes.cpython-38.pyc | Bin 0 -> 617 bytes .../utils/__pycache__/glibc.cpython-38.pyc | Bin 0 -> 1769 bytes .../utils/__pycache__/hashes.cpython-38.pyc | Bin 0 -> 4205 bytes .../inject_securetransport.cpython-38.pyc | Bin 0 -> 993 bytes .../utils/__pycache__/logging.cpython-38.pyc | Bin 0 -> 9220 bytes .../__pycache__/marker_files.cpython-38.pyc | Bin 0 -> 989 bytes .../utils/__pycache__/misc.cpython-38.pyc | Bin 0 -> 23839 bytes .../utils/__pycache__/models.cpython-38.pyc | Bin 0 -> 1985 bytes .../__pycache__/packaging.cpython-38.pyc | Bin 0 -> 2669 bytes .../__pycache__/pkg_resources.cpython-38.pyc | Bin 0 -> 1883 bytes .../setuptools_build.cpython-38.pyc | Bin 0 -> 2988 bytes .../__pycache__/subprocess.cpython-38.pyc | Bin 0 -> 5659 bytes .../utils/__pycache__/temp_dir.cpython-38.pyc | Bin 0 -> 6772 bytes .../utils/__pycache__/typing.cpython-38.pyc | Bin 0 -> 1498 bytes .../utils/__pycache__/ui.cpython-38.pyc | Bin 0 -> 11863 bytes .../__pycache__/unpacking.cpython-38.pyc | Bin 0 -> 6136 bytes .../utils/__pycache__/urls.cpython-38.pyc | Bin 0 -> 1526 bytes .../__pycache__/virtualenv.cpython-38.pyc | Bin 0 -> 3341 bytes .../utils/__pycache__/wheel.cpython-38.pyc | Bin 0 -> 6386 bytes .../pip/_internal/utils/appdirs.py | 41 + .../pip/_internal/utils/compat.py | 269 + .../pip/_internal/utils/deprecation.py | 104 + .../pip/_internal/utils/distutils_args.py | 48 + .../pip/_internal/utils/encoding.py | 42 + .../pip/_internal/utils/entrypoints.py | 31 + .../pip/_internal/utils/filesystem.py | 171 + .../pip/_internal/utils/filetypes.py | 16 + .../pip/_internal/utils/glibc.py | 98 + .../pip/_internal/utils/hashes.py | 131 + .../_internal/utils/inject_securetransport.py | 36 + .../pip/_internal/utils/logging.py | 398 + .../pip/_internal/utils/marker_files.py | 25 + .../site-packages/pip/_internal/utils/misc.py | 904 ++ .../pip/_internal/utils/models.py | 42 + .../pip/_internal/utils/packaging.py | 94 + .../pip/_internal/utils/pkg_resources.py | 44 + .../pip/_internal/utils/setuptools_build.py | 181 + .../pip/_internal/utils/subprocess.py | 278 + .../pip/_internal/utils/temp_dir.py | 250 + .../pip/_internal/utils/typing.py | 38 + .../site-packages/pip/_internal/utils/ui.py | 428 + .../pip/_internal/utils/unpacking.py | 272 + .../site-packages/pip/_internal/utils/urls.py | 54 + .../pip/_internal/utils/virtualenv.py | 115 + .../pip/_internal/utils/wheel.py | 225 + .../pip/_internal/vcs/__init__.py | 15 + .../vcs/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 509 bytes .../vcs/__pycache__/bazaar.cpython-38.pyc | Bin 0 -> 3808 bytes .../vcs/__pycache__/git.cpython-38.pyc | Bin 0 -> 9559 bytes .../vcs/__pycache__/mercurial.cpython-38.pyc | Bin 0 -> 4949 bytes .../vcs/__pycache__/subversion.cpython-38.pyc | Bin 0 -> 8548 bytes .../__pycache__/versioncontrol.cpython-38.pyc | Bin 0 -> 19277 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 120 + .../site-packages/pip/_internal/vcs/git.py | 389 + .../pip/_internal/vcs/mercurial.py | 155 + .../pip/_internal/vcs/subversion.py | 333 + .../pip/_internal/vcs/versioncontrol.py | 700 ++ .../pip/_internal/wheel_builder.py | 305 + .../site-packages/pip/_vendor/__init__.py | 117 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 3024 bytes .../pkg_resources-0.0.0.dist-info/AUTHORS.txt | 562 ++ .../pkg_resources-0.0.0.dist-info/INSTALLER | 1 + .../pkg_resources-0.0.0.dist-info/LICENSE.txt | 20 + .../pkg_resources-0.0.0.dist-info/METADATA | 13 + .../pkg_resources-0.0.0.dist-info/RECORD | 44 + .../pkg_resources-0.0.0.dist-info/WHEEL | 6 + .../pkg_resources-0.0.0.virtualenv | 0 .../site-packages/pkg_resources/__init__.py | 3296 +++++++ .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 100417 bytes .../__pycache__/py31compat.cpython-38.pyc | Bin 0 -> 661 bytes .../pkg_resources/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 218 bytes .../__pycache__/appdirs.cpython-38.pyc | Bin 0 -> 20571 bytes .../__pycache__/pyparsing.cpython-38.pyc | Bin 0 -> 201695 bytes .../_vendor/__pycache__/six.cpython-38.pyc | Bin 0 -> 24491 bytes .../pkg_resources/_vendor/appdirs.py | 608 ++ .../_vendor/packaging/__about__.py | 21 + .../_vendor/packaging/__init__.py | 14 + .../__pycache__/__about__.cpython-38.pyc | Bin 0 -> 768 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 606 bytes .../__pycache__/_compat.cpython-38.pyc | Bin 0 -> 1042 bytes .../__pycache__/_structures.cpython-38.pyc | Bin 0 -> 2824 bytes .../__pycache__/markers.cpython-38.pyc | Bin 0 -> 8980 bytes .../__pycache__/requirements.cpython-38.pyc | Bin 0 -> 3939 bytes .../__pycache__/specifiers.cpython-38.pyc | Bin 0 -> 19848 bytes .../__pycache__/version.cpython-38.pyc | Bin 0 -> 10695 bytes .../_vendor/packaging/_compat.py | 30 + .../_vendor/packaging/_structures.py | 68 + .../_vendor/packaging/markers.py | 301 + .../_vendor/packaging/requirements.py | 127 + .../_vendor/packaging/specifiers.py | 774 ++ .../pkg_resources/_vendor/packaging/utils.py | 14 + .../_vendor/packaging/version.py | 393 + .../pkg_resources/_vendor/pyparsing.py | 5742 ++++++++++++ .../pkg_resources/_vendor/six.py | 868 ++ .../pkg_resources/extern/__init__.py | 73 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 2467 bytes .../site-packages/pkg_resources/py31compat.py | 23 + .../progress-1.5.dist-info/AUTHORS.txt | 562 ++ .../progress-1.5.dist-info/INSTALLER | 1 + .../progress-1.5.dist-info/LICENSE.txt | 20 + .../progress-1.5.dist-info/METADATA | 173 + .../progress-1.5.dist-info/RECORD | 18 + .../progress-1.5.dist-info/WHEEL | 6 + .../progress-1.5.dist-info/top_level.txt | 1 + .../site-packages/progress-1.5.virtualenv | 0 .../site-packages/progress/__init__.py | 177 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 5630 bytes .../progress/__pycache__/bar.cpython-38.pyc | Bin 0 -> 2654 bytes .../__pycache__/spinner.cpython-38.pyc | Bin 0 -> 1413 bytes .../python3.8/site-packages/progress/bar.py | 91 + .../site-packages/progress/counter.py | 41 + .../site-packages/progress/spinner.py | 43 + .../pyparsing-2.4.6.dist-info/AUTHORS.txt | 562 ++ .../pyparsing-2.4.6.dist-info/INSTALLER | 1 + .../pyparsing-2.4.6.dist-info/LICENSE.txt | 20 + .../pyparsing-2.4.6.dist-info/METADATA | 104 + .../pyparsing-2.4.6.dist-info/RECORD | 11 + .../pyparsing-2.4.6.dist-info/WHEEL | 6 + .../pyparsing-2.4.6.dist-info/top_level.txt | 1 + .../site-packages/pyparsing-2.4.6.virtualenv | 0 .../lib/python3.8/site-packages/pyparsing.py | 7090 ++++++++++++++ .../pytoml-0.1.21.dist-info/AUTHORS.txt | 562 ++ .../pytoml-0.1.21.dist-info/INSTALLER | 1 + .../pytoml-0.1.21.dist-info/LICENSE.txt | 20 + .../pytoml-0.1.21.dist-info/METADATA | 69 + .../pytoml-0.1.21.dist-info/RECORD | 22 + .../pytoml-0.1.21.dist-info/WHEEL | 6 + .../pytoml-0.1.21.dist-info/top_level.txt | 1 + .../site-packages/pytoml-0.1.21.virtualenv | 0 .../site-packages/pytoml/__init__.py | 4 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 389 bytes .../pytoml/__pycache__/core.cpython-38.pyc | Bin 0 -> 966 bytes .../pytoml/__pycache__/parser.cpython-38.pyc | Bin 0 -> 10131 bytes .../pytoml/__pycache__/test.cpython-38.pyc | Bin 0 -> 1268 bytes .../pytoml/__pycache__/utils.cpython-38.pyc | Bin 0 -> 2178 bytes .../pytoml/__pycache__/writer.cpython-38.pyc | Bin 0 -> 3754 bytes .../python3.8/site-packages/pytoml/core.py | 13 + .../python3.8/site-packages/pytoml/parser.py | 342 + .../python3.8/site-packages/pytoml/test.py | 30 + .../python3.8/site-packages/pytoml/utils.py | 67 + .../python3.8/site-packages/pytoml/writer.py | 114 + .../requests-2.22.0.dist-info/AUTHORS.txt | 562 ++ .../requests-2.22.0.dist-info/INSTALLER | 1 + .../requests-2.22.0.dist-info/LICENSE.txt | 20 + .../requests-2.22.0.dist-info/METADATA | 141 + .../requests-2.22.0.dist-info/RECORD | 46 + .../requests-2.22.0.dist-info/WHEEL | 6 + .../requests-2.22.0.dist-info/top_level.txt | 1 + .../site-packages/requests-2.22.0.virtualenv | 0 .../site-packages/requests/__init__.py | 131 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 3393 bytes .../__pycache__/__version__.cpython-38.pyc | Bin 0 -> 563 bytes .../_internal_utils.cpython-38.pyc | Bin 0 -> 1333 bytes .../__pycache__/adapters.cpython-38.pyc | Bin 0 -> 16924 bytes .../requests/__pycache__/api.cpython-38.pyc | Bin 0 -> 6520 bytes .../requests/__pycache__/auth.cpython-38.pyc | Bin 0 -> 8342 bytes .../requests/__pycache__/certs.cpython-38.pyc | Bin 0 -> 634 bytes .../__pycache__/compat.cpython-38.pyc | Bin 0 -> 1668 bytes .../__pycache__/cookies.cpython-38.pyc | Bin 0 -> 18847 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 0 -> 5245 bytes .../requests/__pycache__/hooks.cpython-38.pyc | Bin 0 -> 1005 bytes .../__pycache__/models.cpython-38.pyc | Bin 0 -> 23869 bytes .../__pycache__/packages.cpython-38.pyc | Bin 0 -> 422 bytes .../__pycache__/sessions.cpython-38.pyc | Bin 0 -> 19555 bytes .../__pycache__/status_codes.cpython-38.pyc | Bin 0 -> 4201 bytes .../__pycache__/structures.cpython-38.pyc | Bin 0 -> 4443 bytes .../requests/__pycache__/utils.cpython-38.pyc | Bin 0 -> 22212 bytes .../site-packages/requests/__version__.py | 14 + .../site-packages/requests/_internal_utils.py | 42 + .../site-packages/requests/adapters.py | 533 ++ .../python3.8/site-packages/requests/api.py | 158 + .../python3.8/site-packages/requests/auth.py | 305 + .../python3.8/site-packages/requests/certs.py | 18 + .../site-packages/requests/compat.py | 70 + .../site-packages/requests/cookies.py | 549 ++ .../site-packages/requests/exceptions.py | 126 + .../python3.8/site-packages/requests/help.py | 119 + .../python3.8/site-packages/requests/hooks.py | 34 + .../site-packages/requests/models.py | 953 ++ .../site-packages/requests/packages.py | 14 + .../site-packages/requests/sessions.py | 770 ++ .../site-packages/requests/status_codes.py | 120 + .../site-packages/requests/structures.py | 103 + .../python3.8/site-packages/requests/utils.py | 977 ++ .../retrying-1.3.3.dist-info/AUTHORS.txt | 562 ++ .../retrying-1.3.3.dist-info/INSTALLER | 1 + .../retrying-1.3.3.dist-info/LICENSE.txt | 20 + .../retrying-1.3.3.dist-info/METADATA | 236 + .../retrying-1.3.3.dist-info/RECORD | 11 + .../retrying-1.3.3.dist-info/WHEEL | 6 + .../retrying-1.3.3.dist-info/top_level.txt | 1 + .../site-packages/retrying-1.3.3.virtualenv | 0 .../lib/python3.8/site-packages/retrying.py | 267 + .../setuptools-44.0.0.dist-info/AUTHORS.txt | 562 ++ .../setuptools-44.0.0.dist-info/INSTALLER | 1 + .../setuptools-44.0.0.dist-info/LICENSE.txt | 20 + .../setuptools-44.0.0.dist-info/METADATA | 82 + .../setuptools-44.0.0.dist-info/RECORD | 171 + .../setuptools-44.0.0.dist-info/WHEEL | 6 + .../dependency_links.txt | 2 + .../entry_points.txt | 68 + .../setuptools-44.0.0.dist-info/top_level.txt | 3 + .../setuptools-44.0.0.dist-info/zip-safe | 1 + .../setuptools-44.0.0.virtualenv | 0 .../site-packages/setuptools/__init__.py | 228 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 7829 bytes .../_deprecation_warning.cpython-38.pyc | Bin 0 -> 577 bytes .../__pycache__/_imp.cpython-38.pyc | Bin 0 -> 1951 bytes .../__pycache__/archive_util.cpython-38.pyc | Bin 0 -> 5189 bytes .../__pycache__/config.cpython-38.pyc | Bin 0 -> 17957 bytes .../__pycache__/depends.cpython-38.pyc | Bin 0 -> 5277 bytes .../__pycache__/dist.cpython-38.pyc | Bin 0 -> 42387 bytes .../__pycache__/extension.cpython-38.pyc | Bin 0 -> 2022 bytes .../__pycache__/glob.cpython-38.pyc | Bin 0 -> 3794 bytes .../__pycache__/lib2to3_ex.cpython-38.pyc | Bin 0 -> 2472 bytes .../__pycache__/monkey.cpython-38.pyc | Bin 0 -> 4705 bytes .../__pycache__/msvc.cpython-38.pyc | Bin 0 -> 39692 bytes .../__pycache__/namespaces.cpython-38.pyc | Bin 0 -> 3677 bytes .../__pycache__/package_index.cpython-38.pyc | Bin 0 -> 33031 bytes .../__pycache__/py27compat.cpython-38.pyc | Bin 0 -> 1810 bytes .../__pycache__/py33compat.cpython-38.pyc | Bin 0 -> 1469 bytes .../__pycache__/py34compat.cpython-38.pyc | Bin 0 -> 511 bytes .../__pycache__/sandbox.cpython-38.pyc | Bin 0 -> 15597 bytes .../__pycache__/ssl_support.cpython-38.pyc | Bin 0 -> 6916 bytes .../__pycache__/unicode_utils.cpython-38.pyc | Bin 0 -> 1212 bytes .../__pycache__/version.cpython-38.pyc | Bin 0 -> 353 bytes .../__pycache__/wheel.cpython-38.pyc | Bin 0 -> 7444 bytes .../windows_support.cpython-38.pyc | Bin 0 -> 1050 bytes .../setuptools/_deprecation_warning.py | 7 + .../site-packages/setuptools/_imp.py | 73 + .../setuptools/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 215 bytes .../__pycache__/ordered_set.cpython-38.pyc | Bin 0 -> 16473 bytes .../_vendor/__pycache__/six.cpython-38.pyc | Bin 0 -> 24488 bytes .../setuptools/_vendor/ordered_set.py | 488 + .../setuptools/_vendor/packaging/__about__.py | 27 + .../setuptools/_vendor/packaging/__init__.py | 26 + .../__pycache__/__about__.cpython-38.pyc | Bin 0 -> 765 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 603 bytes .../__pycache__/_compat.cpython-38.pyc | Bin 0 -> 1039 bytes .../__pycache__/_structures.cpython-38.pyc | Bin 0 -> 2821 bytes .../__pycache__/specifiers.cpython-38.pyc | Bin 0 -> 19795 bytes .../packaging/__pycache__/tags.cpython-38.pyc | Bin 0 -> 10872 bytes .../__pycache__/utils.cpython-38.pyc | Bin 0 -> 1496 bytes .../__pycache__/version.cpython-38.pyc | Bin 0 -> 12126 bytes .../setuptools/_vendor/packaging/_compat.py | 31 + .../_vendor/packaging/_structures.py | 68 + .../setuptools/_vendor/packaging/markers.py | 296 + .../_vendor/packaging/requirements.py | 138 + .../_vendor/packaging/specifiers.py | 749 ++ .../setuptools/_vendor/packaging/tags.py | 404 + .../setuptools/_vendor/packaging/utils.py | 57 + .../setuptools/_vendor/packaging/version.py | 420 + .../setuptools/_vendor/pyparsing.py | 5742 ++++++++++++ .../site-packages/setuptools/_vendor/six.py | 868 ++ .../site-packages/setuptools/archive_util.py | 173 + .../site-packages/setuptools/build_meta.py | 257 + .../site-packages/setuptools/cli-32.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/cli-64.exe | Bin 0 -> 74752 bytes .../site-packages/setuptools/cli.exe | Bin 0 -> 65536 bytes .../setuptools/command/__init__.py | 17 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 773 bytes .../__pycache__/bdist_egg.cpython-38.pyc | Bin 0 -> 14243 bytes .../__pycache__/build_py.cpython-38.pyc | Bin 0 -> 8702 bytes .../__pycache__/easy_install.cpython-38.pyc | Bin 0 -> 66755 bytes .../__pycache__/egg_info.cpython-38.pyc | Bin 0 -> 21834 bytes .../__pycache__/install.cpython-38.pyc | Bin 0 -> 4077 bytes .../install_egg_info.cpython-38.pyc | Bin 0 -> 2961 bytes .../__pycache__/install_lib.cpython-38.pyc | Bin 0 -> 5144 bytes .../install_scripts.cpython-38.pyc | Bin 0 -> 2334 bytes .../__pycache__/py36compat.cpython-38.pyc | Bin 0 -> 4671 bytes .../command/__pycache__/sdist.cpython-38.pyc | Bin 0 -> 7920 bytes .../command/__pycache__/setopt.cpython-38.pyc | Bin 0 -> 4598 bytes .../site-packages/setuptools/command/alias.py | 80 + .../setuptools/command/bdist_egg.py | 502 + .../setuptools/command/bdist_rpm.py | 43 + .../setuptools/command/bdist_wininst.py | 21 + .../setuptools/command/build_clib.py | 98 + .../setuptools/command/build_ext.py | 327 + .../setuptools/command/build_py.py | 270 + .../setuptools/command/develop.py | 221 + .../setuptools/command/dist_info.py | 36 + .../setuptools/command/easy_install.py | 2402 +++++ .../setuptools/command/egg_info.py | 717 ++ .../setuptools/command/install.py | 125 + .../setuptools/command/install_egg_info.py | 82 + .../setuptools/command/install_lib.py | 147 + .../setuptools/command/install_scripts.py | 65 + .../setuptools/command/launcher manifest.xml | 15 + .../setuptools/command/py36compat.py | 136 + .../setuptools/command/register.py | 18 + .../setuptools/command/rotate.py | 66 + .../setuptools/command/saveopts.py | 22 + .../site-packages/setuptools/command/sdist.py | 252 + .../setuptools/command/setopt.py | 149 + .../site-packages/setuptools/command/test.py | 279 + .../setuptools/command/upload.py | 17 + .../setuptools/command/upload_docs.py | 206 + .../site-packages/setuptools/config.py | 659 ++ .../site-packages/setuptools/dep_util.py | 23 + .../site-packages/setuptools/depends.py | 176 + .../site-packages/setuptools/dist.py | 1274 +++ .../site-packages/setuptools/errors.py | 16 + .../site-packages/setuptools/extension.py | 57 + .../setuptools/extern/__init__.py | 73 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 2481 bytes .../site-packages/setuptools/glob.py | 174 + .../site-packages/setuptools/gui-32.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/gui-64.exe | Bin 0 -> 75264 bytes .../site-packages/setuptools/gui.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/installer.py | 150 + .../site-packages/setuptools/launch.py | 35 + .../site-packages/setuptools/lib2to3_ex.py | 62 + .../site-packages/setuptools/monkey.py | 179 + .../site-packages/setuptools/msvc.py | 1679 ++++ .../site-packages/setuptools/namespaces.py | 107 + .../site-packages/setuptools/package_index.py | 1136 +++ .../site-packages/setuptools/py27compat.py | 60 + .../site-packages/setuptools/py31compat.py | 32 + .../site-packages/setuptools/py33compat.py | 59 + .../site-packages/setuptools/py34compat.py | 13 + .../site-packages/setuptools/sandbox.py | 491 + .../setuptools/script (dev).tmpl | 6 + .../site-packages/setuptools/script.tmpl | 3 + .../site-packages/setuptools/site-patch.py | 74 + .../site-packages/setuptools/ssl_support.py | 260 + .../site-packages/setuptools/unicode_utils.py | 44 + .../site-packages/setuptools/version.py | 6 + .../site-packages/setuptools/wheel.py | 220 + .../setuptools/windows_support.py | 29 + .../six-1.14.0.dist-info/AUTHORS.txt | 562 ++ .../six-1.14.0.dist-info/INSTALLER | 1 + .../six-1.14.0.dist-info/LICENSE.txt | 20 + .../six-1.14.0.dist-info/METADATA | 49 + .../site-packages/six-1.14.0.dist-info/RECORD | 11 + .../site-packages/six-1.14.0.dist-info/WHEEL | 6 + .../six-1.14.0.dist-info/top_level.txt | 1 + .../site-packages/six-1.14.0.virtualenv | 0 cres/venv/lib/python3.8/site-packages/six.py | 980 ++ .../urllib3-1.25.8.dist-info/AUTHORS.txt | 562 ++ .../urllib3-1.25.8.dist-info/INSTALLER | 1 + .../urllib3-1.25.8.dist-info/LICENSE.txt | 20 + .../urllib3-1.25.8.dist-info/METADATA | 1238 +++ .../urllib3-1.25.8.dist-info/RECORD | 86 + .../urllib3-1.25.8.dist-info/WHEEL | 6 + .../urllib3-1.25.8.dist-info/top_level.txt | 1 + .../site-packages/urllib3-1.25.8.virtualenv | 0 .../site-packages/urllib3/__init__.py | 86 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 2134 bytes .../__pycache__/_collections.cpython-38.pyc | Bin 0 -> 10679 bytes .../__pycache__/connection.cpython-38.pyc | Bin 0 -> 10114 bytes .../__pycache__/connectionpool.cpython-38.pyc | Bin 0 -> 24210 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 0 -> 10063 bytes .../urllib3/__pycache__/fields.cpython-38.pyc | Bin 0 -> 8122 bytes .../__pycache__/filepost.cpython-38.pyc | Bin 0 -> 2748 bytes .../__pycache__/poolmanager.cpython-38.pyc | Bin 0 -> 12923 bytes .../__pycache__/request.cpython-38.pyc | Bin 0 -> 5662 bytes .../__pycache__/response.cpython-38.pyc | Bin 0 -> 20364 bytes .../site-packages/urllib3/_collections.py | 336 + .../site-packages/urllib3/connection.py | 414 + .../site-packages/urllib3/connectionpool.py | 1053 +++ .../site-packages/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 212 bytes .../_appengine_environ.cpython-38.pyc | Bin 0 -> 1436 bytes .../__pycache__/ntlmpool.cpython-38.pyc | Bin 0 -> 3284 bytes .../__pycache__/pyopenssl.cpython-38.pyc | Bin 0 -> 14937 bytes .../contrib/__pycache__/socks.cpython-38.pyc | Bin 0 -> 5596 bytes .../urllib3/contrib/_appengine_environ.py | 36 + .../contrib/_securetransport/__init__.py | 0 .../contrib/_securetransport/bindings.py | 493 + .../contrib/_securetransport/low_level.py | 328 + .../urllib3/contrib/appengine.py | 314 + .../site-packages/urllib3/contrib/ntlmpool.py | 121 + .../urllib3/contrib/pyopenssl.py | 498 + .../urllib3/contrib/securetransport.py | 859 ++ .../site-packages/urllib3/contrib/socks.py | 210 + .../site-packages/urllib3/exceptions.py | 255 + .../python3.8/site-packages/urllib3/fields.py | 273 + .../site-packages/urllib3/filepost.py | 98 + .../urllib3/packages/__init__.py | 11 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 427 bytes .../urllib3/packages/backports/__init__.py | 0 .../urllib3/packages/backports/makefile.py | 52 + .../packages/ssl_match_hostname/__init__.py | 19 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 567 bytes .../_implementation.cpython-38.pyc | Bin 0 -> 3324 bytes .../ssl_match_hostname/_implementation.py | 160 + .../site-packages/urllib3/poolmanager.py | 470 + .../site-packages/urllib3/request.py | 171 + .../site-packages/urllib3/response.py | 809 ++ .../site-packages/urllib3/util/__init__.py | 46 + .../util/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 1032 bytes .../__pycache__/connection.cpython-38.pyc | Bin 0 -> 3205 bytes .../util/__pycache__/queue.cpython-38.pyc | Bin 0 -> 1042 bytes .../util/__pycache__/request.cpython-38.pyc | Bin 0 -> 3362 bytes .../util/__pycache__/response.cpython-38.pyc | Bin 0 -> 1989 bytes .../util/__pycache__/retry.cpython-38.pyc | Bin 0 -> 12973 bytes .../util/__pycache__/ssl_.cpython-38.pyc | Bin 0 -> 9841 bytes .../util/__pycache__/timeout.cpython-38.pyc | Bin 0 -> 8892 bytes .../util/__pycache__/url.cpython-38.pyc | Bin 0 -> 10695 bytes .../util/__pycache__/wait.cpython-38.pyc | Bin 0 -> 3126 bytes .../site-packages/urllib3/util/connection.py | 138 + .../site-packages/urllib3/util/queue.py | 21 + .../site-packages/urllib3/util/request.py | 135 + .../site-packages/urllib3/util/response.py | 86 + .../site-packages/urllib3/util/retry.py | 450 + .../site-packages/urllib3/util/ssl_.py | 407 + .../site-packages/urllib3/util/timeout.py | 258 + .../site-packages/urllib3/util/url.py | 430 + .../site-packages/urllib3/util/wait.py | 153 + .../webencodings-0.5.1.dist-info/AUTHORS.txt | 562 ++ .../webencodings-0.5.1.dist-info/INSTALLER | 1 + .../webencodings-0.5.1.dist-info/LICENSE.txt | 20 + .../webencodings-0.5.1.dist-info/METADATA | 54 + .../webencodings-0.5.1.dist-info/RECORD | 20 + .../webencodings-0.5.1.dist-info/WHEEL | 6 + .../top_level.txt | 1 + .../webencodings-0.5.1.virtualenv | 0 .../site-packages/webencodings/__init__.py | 342 + .../__pycache__/__init__.cpython-38.pyc | Bin 0 -> 9752 bytes .../__pycache__/labels.cpython-38.pyc | Bin 0 -> 3850 bytes .../site-packages/webencodings/labels.py | 231 + .../site-packages/webencodings/mklabels.py | 59 + .../site-packages/webencodings/tests.py | 153 + .../webencodings/x_user_defined.py | 325 + .../wheel-0.34.2.dist-info/AUTHORS.txt | 562 ++ .../wheel-0.34.2.dist-info/INSTALLER | 1 + .../wheel-0.34.2.dist-info/LICENSE.txt | 20 + .../wheel-0.34.2.dist-info/METADATA | 66 + .../wheel-0.34.2.dist-info/RECORD | 43 + .../wheel-0.34.2.dist-info/WHEEL | 6 + .../wheel-0.34.2.dist-info/entry_points.txt | 6 + .../wheel-0.34.2.dist-info/top_level.txt | 1 + .../site-packages/wheel-0.34.2.virtualenv | 0 .../python3.8/site-packages/wheel/__init__.py | 1 + .../python3.8/site-packages/wheel/__main__.py | 19 + .../wheel/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 224 bytes .../__pycache__/bdist_wheel.cpython-38.pyc | Bin 0 -> 10930 bytes .../__pycache__/macosx_libfile.cpython-38.pyc | Bin 0 -> 7151 bytes .../wheel/__pycache__/metadata.cpython-38.pyc | Bin 0 -> 3760 bytes .../__pycache__/pep425tags.cpython-38.pyc | Bin 0 -> 7648 bytes .../wheel/__pycache__/pkginfo.cpython-38.pyc | Bin 0 -> 1585 bytes .../wheel/__pycache__/util.cpython-38.pyc | Bin 0 -> 1338 bytes .../__pycache__/wheelfile.cpython-38.pyc | Bin 0 -> 5556 bytes .../python3.8/site-packages/wheel/_version.py | 4 + .../site-packages/wheel/bdist_wheel.py | 403 + .../site-packages/wheel/cli/__init__.py | 88 + .../cli/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 3108 bytes .../site-packages/wheel/cli/convert.py | 269 + .../python3.8/site-packages/wheel/cli/pack.py | 79 + .../site-packages/wheel/cli/unpack.py | 25 + .../site-packages/wheel/macosx_libfile.py | 341 + .../python3.8/site-packages/wheel/metadata.py | 138 + .../site-packages/wheel/pep425tags.py | 261 + .../python3.8/site-packages/wheel/pkginfo.py | 43 + .../lib/python3.8/site-packages/wheel/util.py | 46 + .../site-packages/wheel/wheelfile.py | 169 + .../python3.8/site-packages/yaml/__init__.py | 427 + .../yaml/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 11851 bytes .../yaml/__pycache__/composer.cpython-38.pyc | Bin 0 -> 3569 bytes .../__pycache__/constructor.cpython-38.pyc | Bin 0 -> 20828 bytes .../yaml/__pycache__/cyaml.cpython-38.pyc | Bin 0 -> 3412 bytes .../yaml/__pycache__/dumper.cpython-38.pyc | Bin 0 -> 1829 bytes .../yaml/__pycache__/emitter.cpython-38.pyc | Bin 0 -> 25359 bytes .../yaml/__pycache__/error.cpython-38.pyc | Bin 0 -> 2306 bytes .../yaml/__pycache__/events.cpython-38.pyc | Bin 0 -> 3980 bytes .../yaml/__pycache__/loader.cpython-38.pyc | Bin 0 -> 2170 bytes .../yaml/__pycache__/nodes.cpython-38.pyc | Bin 0 -> 1731 bytes .../yaml/__pycache__/parser.cpython-38.pyc | Bin 0 -> 11930 bytes .../yaml/__pycache__/reader.cpython-38.pyc | Bin 0 -> 4543 bytes .../__pycache__/representer.cpython-38.pyc | Bin 0 -> 10075 bytes .../yaml/__pycache__/resolver.cpython-38.pyc | Bin 0 -> 5484 bytes .../yaml/__pycache__/scanner.cpython-38.pyc | Bin 0 -> 25275 bytes .../__pycache__/serializer.cpython-38.pyc | Bin 0 -> 3326 bytes .../yaml/__pycache__/tokens.cpython-38.pyc | Bin 0 -> 4941 bytes .../python3.8/site-packages/yaml/composer.py | 139 + .../site-packages/yaml/constructor.py | 748 ++ .../lib/python3.8/site-packages/yaml/cyaml.py | 101 + .../python3.8/site-packages/yaml/dumper.py | 62 + .../python3.8/site-packages/yaml/emitter.py | 1137 +++ .../lib/python3.8/site-packages/yaml/error.py | 75 + .../python3.8/site-packages/yaml/events.py | 86 + .../python3.8/site-packages/yaml/loader.py | 63 + .../lib/python3.8/site-packages/yaml/nodes.py | 49 + .../python3.8/site-packages/yaml/parser.py | 589 ++ .../python3.8/site-packages/yaml/reader.py | 185 + .../site-packages/yaml/representer.py | 389 + .../python3.8/site-packages/yaml/resolver.py | 227 + .../python3.8/site-packages/yaml/scanner.py | 1435 +++ .../site-packages/yaml/serializer.py | 111 + .../python3.8/site-packages/yaml/tokens.py | 104 + cres/venv/pyvenv.cfg | 8 + index.md | 5 +- 1088 files changed, 175621 insertions(+), 3 deletions(-) create mode 100644 cres/venv/bin/activate create mode 100644 cres/venv/bin/activate.csh create mode 100644 cres/venv/bin/activate.fish create mode 100644 cres/venv/bin/activate.ps1 create mode 100644 cres/venv/bin/activate.xsh create mode 100644 cres/venv/bin/activate_this.py create mode 100755 cres/venv/bin/chardetect create mode 100755 cres/venv/bin/chardetect-3.8 create mode 100755 cres/venv/bin/chardetect3 create mode 100755 cres/venv/bin/distro create mode 100755 cres/venv/bin/distro-3.8 create mode 100755 cres/venv/bin/distro3 create mode 100755 cres/venv/bin/easy_install create mode 100755 cres/venv/bin/easy_install-3.8 create mode 100755 cres/venv/bin/easy_install3 create mode 100755 cres/venv/bin/pip create mode 100755 cres/venv/bin/pip-3.8 create mode 100755 cres/venv/bin/pip3 create mode 100755 cres/venv/bin/pip3.8 create mode 120000 cres/venv/bin/python create mode 120000 cres/venv/bin/python3 create mode 120000 cres/venv/bin/python3.8 create mode 100755 cres/venv/bin/wheel create mode 100755 cres/venv/bin/wheel-3.8 create mode 100755 cres/venv/bin/wheel3 create mode 100644 cres/venv/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/AUTHORS.txt create mode 100644 cres/venv/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/INSTALLER create mode 100644 cres/venv/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/LICENSE.txt create mode 100644 cres/venv/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/METADATA create mode 100644 cres/venv/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/RECORD create mode 100644 cres/venv/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/WHEEL create mode 100644 cres/venv/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/top_level.txt create mode 100644 cres/venv/lib/python3.8/site-packages/CacheControl-0.12.6.virtualenv create mode 100644 cres/venv/lib/python3.8/site-packages/PyYAML-5.3.1.dist-info/INSTALLER create mode 100644 cres/venv/lib/python3.8/site-packages/PyYAML-5.3.1.dist-info/LICENSE create mode 100644 cres/venv/lib/python3.8/site-packages/PyYAML-5.3.1.dist-info/METADATA create mode 100644 cres/venv/lib/python3.8/site-packages/PyYAML-5.3.1.dist-info/RECORD create mode 100644 cres/venv/lib/python3.8/site-packages/PyYAML-5.3.1.dist-info/WHEEL create mode 100644 cres/venv/lib/python3.8/site-packages/PyYAML-5.3.1.dist-info/top_level.txt create mode 100644 cres/venv/lib/python3.8/site-packages/__pycache__/_virtualenv.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/__pycache__/appdirs.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/__pycache__/contextlib2.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/__pycache__/distro.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/__pycache__/pyparsing.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/__pycache__/retrying.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/__pycache__/six.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/_virtualenv.pth create mode 100644 cres/venv/lib/python3.8/site-packages/_virtualenv.py create mode 100644 cres/venv/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/AUTHORS.txt create mode 100644 cres/venv/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/INSTALLER create mode 100644 cres/venv/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/LICENSE.txt create mode 100644 cres/venv/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/METADATA create mode 100644 cres/venv/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/RECORD create mode 100644 cres/venv/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/WHEEL create mode 100644 cres/venv/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/top_level.txt create mode 100644 cres/venv/lib/python3.8/site-packages/appdirs-1.4.3.virtualenv create mode 100644 cres/venv/lib/python3.8/site-packages/appdirs.py create mode 100644 cres/venv/lib/python3.8/site-packages/cachecontrol/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/cachecontrol/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/cachecontrol/__pycache__/adapter.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/cachecontrol/__pycache__/cache.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/cachecontrol/__pycache__/compat.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/cachecontrol/__pycache__/controller.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/cachecontrol/__pycache__/filewrapper.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/cachecontrol/__pycache__/serialize.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/cachecontrol/__pycache__/wrapper.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/cachecontrol/_cmd.py create mode 100644 cres/venv/lib/python3.8/site-packages/cachecontrol/adapter.py create mode 100644 cres/venv/lib/python3.8/site-packages/cachecontrol/cache.py create mode 100644 cres/venv/lib/python3.8/site-packages/cachecontrol/caches/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/cachecontrol/caches/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/cachecontrol/caches/__pycache__/file_cache.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/cachecontrol/caches/__pycache__/redis_cache.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/cachecontrol/caches/file_cache.py create mode 100644 cres/venv/lib/python3.8/site-packages/cachecontrol/caches/redis_cache.py create mode 100644 cres/venv/lib/python3.8/site-packages/cachecontrol/compat.py create mode 100644 cres/venv/lib/python3.8/site-packages/cachecontrol/controller.py create mode 100644 cres/venv/lib/python3.8/site-packages/cachecontrol/filewrapper.py create mode 100644 cres/venv/lib/python3.8/site-packages/cachecontrol/heuristics.py create mode 100644 cres/venv/lib/python3.8/site-packages/cachecontrol/serialize.py create mode 100644 cres/venv/lib/python3.8/site-packages/cachecontrol/wrapper.py create mode 100644 cres/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/AUTHORS.txt create mode 100644 cres/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/INSTALLER create mode 100644 cres/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/LICENSE.txt create mode 100644 cres/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/METADATA create mode 100644 cres/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/RECORD create mode 100644 cres/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/WHEEL create mode 100644 cres/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/top_level.txt create mode 100644 cres/venv/lib/python3.8/site-packages/certifi-2019.11.28.virtualenv create mode 100644 cres/venv/lib/python3.8/site-packages/certifi/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/certifi/__main__.py create mode 100644 cres/venv/lib/python3.8/site-packages/certifi/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/certifi/__pycache__/core.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/certifi/cacert.pem create mode 100644 cres/venv/lib/python3.8/site-packages/certifi/core.py create mode 100644 cres/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/AUTHORS.txt create mode 100644 cres/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/INSTALLER create mode 100644 cres/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/LICENSE.txt create mode 100644 cres/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/METADATA create mode 100644 cres/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/RECORD create mode 100644 cres/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/WHEEL create mode 100644 cres/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/entry_points.txt create mode 100644 cres/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/top_level.txt create mode 100644 cres/venv/lib/python3.8/site-packages/chardet-3.0.4.virtualenv create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/__pycache__/big5freq.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/__pycache__/big5prober.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/__pycache__/chardistribution.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/__pycache__/charsetgroupprober.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/__pycache__/charsetprober.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/__pycache__/codingstatemachine.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/__pycache__/compat.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/__pycache__/cp949prober.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/__pycache__/enums.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/__pycache__/escprober.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/__pycache__/escsm.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/__pycache__/eucjpprober.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/__pycache__/euckrfreq.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/__pycache__/euckrprober.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/__pycache__/euctwfreq.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/__pycache__/euctwprober.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/__pycache__/gb2312freq.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/__pycache__/gb2312prober.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/__pycache__/hebrewprober.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/__pycache__/jisfreq.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/__pycache__/jpcntx.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/__pycache__/langbulgarianmodel.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/__pycache__/langcyrillicmodel.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/__pycache__/langgreekmodel.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/__pycache__/langhebrewmodel.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/__pycache__/langthaimodel.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/__pycache__/langturkishmodel.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/__pycache__/latin1prober.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/__pycache__/mbcharsetprober.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/__pycache__/mbcsgroupprober.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/__pycache__/mbcssm.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/__pycache__/sbcharsetprober.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/__pycache__/sbcsgroupprober.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/__pycache__/sjisprober.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/__pycache__/universaldetector.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/__pycache__/utf8prober.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/__pycache__/version.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/big5freq.py create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/big5prober.py create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/chardistribution.py create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/charsetgroupprober.py create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/charsetprober.py create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/cli/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/cli/chardetect.py create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/codingstatemachine.py create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/compat.py create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/cp949prober.py create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/enums.py create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/escprober.py create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/escsm.py create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/eucjpprober.py create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/euckrfreq.py create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/euckrprober.py create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/euctwfreq.py create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/euctwprober.py create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/gb2312freq.py create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/gb2312prober.py create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/hebrewprober.py create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/jisfreq.py create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/jpcntx.py create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/langbulgarianmodel.py create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/langcyrillicmodel.py create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/langgreekmodel.py create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/langhebrewmodel.py create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/langhungarianmodel.py create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/langthaimodel.py create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/langturkishmodel.py create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/latin1prober.py create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/mbcharsetprober.py create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/mbcsgroupprober.py create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/mbcssm.py create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/sbcharsetprober.py create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/sbcsgroupprober.py create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/sjisprober.py create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/universaldetector.py create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/utf8prober.py create mode 100644 cres/venv/lib/python3.8/site-packages/chardet/version.py create mode 100644 cres/venv/lib/python3.8/site-packages/colorama-0.4.3.dist-info/AUTHORS.txt create mode 100644 cres/venv/lib/python3.8/site-packages/colorama-0.4.3.dist-info/INSTALLER create mode 100644 cres/venv/lib/python3.8/site-packages/colorama-0.4.3.dist-info/LICENSE.txt create mode 100644 cres/venv/lib/python3.8/site-packages/colorama-0.4.3.dist-info/METADATA create mode 100644 cres/venv/lib/python3.8/site-packages/colorama-0.4.3.dist-info/RECORD create mode 100644 cres/venv/lib/python3.8/site-packages/colorama-0.4.3.dist-info/WHEEL create mode 100644 cres/venv/lib/python3.8/site-packages/colorama-0.4.3.dist-info/top_level.txt create mode 100644 cres/venv/lib/python3.8/site-packages/colorama-0.4.3.virtualenv create mode 100644 cres/venv/lib/python3.8/site-packages/colorama/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/colorama/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/colorama/__pycache__/ansi.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/colorama/__pycache__/ansitowin32.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/colorama/__pycache__/initialise.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/colorama/__pycache__/win32.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/colorama/__pycache__/winterm.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/colorama/ansi.py create mode 100644 cres/venv/lib/python3.8/site-packages/colorama/ansitowin32.py create mode 100644 cres/venv/lib/python3.8/site-packages/colorama/initialise.py create mode 100644 cres/venv/lib/python3.8/site-packages/colorama/win32.py create mode 100644 cres/venv/lib/python3.8/site-packages/colorama/winterm.py create mode 100644 cres/venv/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/AUTHORS.txt create mode 100644 cres/venv/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/INSTALLER create mode 100644 cres/venv/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/LICENSE.txt create mode 100644 cres/venv/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/METADATA create mode 100644 cres/venv/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/RECORD create mode 100644 cres/venv/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/WHEEL create mode 100644 cres/venv/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/top_level.txt create mode 100644 cres/venv/lib/python3.8/site-packages/contextlib2-0.6.0.virtualenv create mode 100644 cres/venv/lib/python3.8/site-packages/contextlib2.py create mode 100644 cres/venv/lib/python3.8/site-packages/distlib-0.3.0.dist-info/AUTHORS.txt create mode 100644 cres/venv/lib/python3.8/site-packages/distlib-0.3.0.dist-info/INSTALLER create mode 100644 cres/venv/lib/python3.8/site-packages/distlib-0.3.0.dist-info/LICENSE.txt create mode 100644 cres/venv/lib/python3.8/site-packages/distlib-0.3.0.dist-info/METADATA create mode 100644 cres/venv/lib/python3.8/site-packages/distlib-0.3.0.dist-info/RECORD create mode 100644 cres/venv/lib/python3.8/site-packages/distlib-0.3.0.dist-info/WHEEL create mode 100644 cres/venv/lib/python3.8/site-packages/distlib-0.3.0.dist-info/top_level.txt create mode 100644 cres/venv/lib/python3.8/site-packages/distlib-0.3.0.virtualenv create mode 100644 cres/venv/lib/python3.8/site-packages/distlib/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/distlib/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/distlib/__pycache__/compat.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/distlib/__pycache__/resources.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/distlib/__pycache__/scripts.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/distlib/__pycache__/util.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/distlib/_backport/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/distlib/_backport/misc.py create mode 100644 cres/venv/lib/python3.8/site-packages/distlib/_backport/shutil.py create mode 100644 cres/venv/lib/python3.8/site-packages/distlib/_backport/sysconfig.cfg create mode 100644 cres/venv/lib/python3.8/site-packages/distlib/_backport/sysconfig.py create mode 100644 cres/venv/lib/python3.8/site-packages/distlib/_backport/tarfile.py create mode 100644 cres/venv/lib/python3.8/site-packages/distlib/compat.py create mode 100644 cres/venv/lib/python3.8/site-packages/distlib/database.py create mode 100644 cres/venv/lib/python3.8/site-packages/distlib/index.py create mode 100644 cres/venv/lib/python3.8/site-packages/distlib/locators.py create mode 100644 cres/venv/lib/python3.8/site-packages/distlib/manifest.py create mode 100644 cres/venv/lib/python3.8/site-packages/distlib/markers.py create mode 100644 cres/venv/lib/python3.8/site-packages/distlib/metadata.py create mode 100644 cres/venv/lib/python3.8/site-packages/distlib/resources.py create mode 100644 cres/venv/lib/python3.8/site-packages/distlib/scripts.py create mode 100644 cres/venv/lib/python3.8/site-packages/distlib/util.py create mode 100644 cres/venv/lib/python3.8/site-packages/distlib/version.py create mode 100644 cres/venv/lib/python3.8/site-packages/distlib/wheel.py create mode 100644 cres/venv/lib/python3.8/site-packages/distro-1.4.0.dist-info/AUTHORS.txt create mode 100644 cres/venv/lib/python3.8/site-packages/distro-1.4.0.dist-info/INSTALLER create mode 100644 cres/venv/lib/python3.8/site-packages/distro-1.4.0.dist-info/LICENSE.txt create mode 100644 cres/venv/lib/python3.8/site-packages/distro-1.4.0.dist-info/METADATA create mode 100644 cres/venv/lib/python3.8/site-packages/distro-1.4.0.dist-info/RECORD create mode 100644 cres/venv/lib/python3.8/site-packages/distro-1.4.0.dist-info/WHEEL create mode 100644 cres/venv/lib/python3.8/site-packages/distro-1.4.0.dist-info/entry_points.txt create mode 100644 cres/venv/lib/python3.8/site-packages/distro-1.4.0.dist-info/top_level.txt create mode 100644 cres/venv/lib/python3.8/site-packages/distro-1.4.0.virtualenv create mode 100644 cres/venv/lib/python3.8/site-packages/distro.py create mode 100644 cres/venv/lib/python3.8/site-packages/easy_install.py create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/AUTHORS.txt create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/INSTALLER create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/LICENSE.txt create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/METADATA create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/RECORD create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/WHEEL create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/top_level.txt create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib-1.0.1.virtualenv create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/__pycache__/_ihatexml.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/__pycache__/_inputstream.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/__pycache__/_tokenizer.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/__pycache__/_utils.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/__pycache__/constants.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/__pycache__/html5parser.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/__pycache__/serializer.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/_ihatexml.py create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/_inputstream.py create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/_tokenizer.py create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/_trie/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/_trie/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/_trie/__pycache__/_base.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/_trie/__pycache__/datrie.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/_trie/__pycache__/py.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/_trie/_base.py create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/_trie/datrie.py create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/_trie/py.py create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/_utils.py create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/constants.py create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/filters/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/filters/alphabeticalattributes.py create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/filters/base.py create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/filters/inject_meta_charset.py create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/filters/lint.py create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/filters/optionaltags.py create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/filters/sanitizer.py create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/filters/whitespace.py create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/html5parser.py create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/serializer.py create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/treeadapters/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/treeadapters/genshi.py create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/treeadapters/sax.py create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/treebuilders/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/treebuilders/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/treebuilders/__pycache__/base.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/treebuilders/__pycache__/etree.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/treebuilders/base.py create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/treebuilders/dom.py create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/treebuilders/etree.py create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/treebuilders/etree_lxml.py create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/treewalkers/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/treewalkers/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/treewalkers/base.py create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/treewalkers/dom.py create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/treewalkers/etree.py create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/treewalkers/etree_lxml.py create mode 100644 cres/venv/lib/python3.8/site-packages/html5lib/treewalkers/genshi.py create mode 100644 cres/venv/lib/python3.8/site-packages/idna-2.8.dist-info/AUTHORS.txt create mode 100644 cres/venv/lib/python3.8/site-packages/idna-2.8.dist-info/INSTALLER create mode 100644 cres/venv/lib/python3.8/site-packages/idna-2.8.dist-info/LICENSE.txt create mode 100644 cres/venv/lib/python3.8/site-packages/idna-2.8.dist-info/METADATA create mode 100644 cres/venv/lib/python3.8/site-packages/idna-2.8.dist-info/RECORD create mode 100644 cres/venv/lib/python3.8/site-packages/idna-2.8.dist-info/WHEEL create mode 100644 cres/venv/lib/python3.8/site-packages/idna-2.8.dist-info/top_level.txt create mode 100644 cres/venv/lib/python3.8/site-packages/idna-2.8.virtualenv create mode 100644 cres/venv/lib/python3.8/site-packages/idna/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/idna/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/idna/__pycache__/core.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/idna/__pycache__/idnadata.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/idna/__pycache__/intranges.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/idna/__pycache__/package_data.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/idna/codec.py create mode 100644 cres/venv/lib/python3.8/site-packages/idna/compat.py create mode 100644 cres/venv/lib/python3.8/site-packages/idna/core.py create mode 100644 cres/venv/lib/python3.8/site-packages/idna/idnadata.py create mode 100644 cres/venv/lib/python3.8/site-packages/idna/intranges.py create mode 100644 cres/venv/lib/python3.8/site-packages/idna/package_data.py create mode 100644 cres/venv/lib/python3.8/site-packages/idna/uts46data.py create mode 100644 cres/venv/lib/python3.8/site-packages/ipaddr-2.2.0.dist-info/AUTHORS.txt create mode 100644 cres/venv/lib/python3.8/site-packages/ipaddr-2.2.0.dist-info/INSTALLER create mode 100644 cres/venv/lib/python3.8/site-packages/ipaddr-2.2.0.dist-info/LICENSE.txt create mode 100644 cres/venv/lib/python3.8/site-packages/ipaddr-2.2.0.dist-info/METADATA create mode 100644 cres/venv/lib/python3.8/site-packages/ipaddr-2.2.0.dist-info/RECORD create mode 100644 cres/venv/lib/python3.8/site-packages/ipaddr-2.2.0.dist-info/WHEEL create mode 100644 cres/venv/lib/python3.8/site-packages/ipaddr-2.2.0.dist-info/top_level.txt create mode 100644 cres/venv/lib/python3.8/site-packages/ipaddr-2.2.0.virtualenv create mode 100644 cres/venv/lib/python3.8/site-packages/ipaddr.py create mode 100644 cres/venv/lib/python3.8/site-packages/lockfile-0.12.2.dist-info/AUTHORS.txt create mode 100644 cres/venv/lib/python3.8/site-packages/lockfile-0.12.2.dist-info/INSTALLER create mode 100644 cres/venv/lib/python3.8/site-packages/lockfile-0.12.2.dist-info/LICENSE.txt create mode 100644 cres/venv/lib/python3.8/site-packages/lockfile-0.12.2.dist-info/METADATA create mode 100644 cres/venv/lib/python3.8/site-packages/lockfile-0.12.2.dist-info/RECORD create mode 100644 cres/venv/lib/python3.8/site-packages/lockfile-0.12.2.dist-info/WHEEL create mode 100644 cres/venv/lib/python3.8/site-packages/lockfile-0.12.2.dist-info/pbr.json create mode 100644 cres/venv/lib/python3.8/site-packages/lockfile-0.12.2.dist-info/top_level.txt create mode 100644 cres/venv/lib/python3.8/site-packages/lockfile-0.12.2.virtualenv create mode 100644 cres/venv/lib/python3.8/site-packages/lockfile/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/lockfile/linklockfile.py create mode 100644 cres/venv/lib/python3.8/site-packages/lockfile/mkdirlockfile.py create mode 100644 cres/venv/lib/python3.8/site-packages/lockfile/pidlockfile.py create mode 100644 cres/venv/lib/python3.8/site-packages/lockfile/sqlitelockfile.py create mode 100644 cres/venv/lib/python3.8/site-packages/lockfile/symlinklockfile.py create mode 100644 cres/venv/lib/python3.8/site-packages/msgpack-0.6.2.dist-info/AUTHORS.txt create mode 100644 cres/venv/lib/python3.8/site-packages/msgpack-0.6.2.dist-info/INSTALLER create mode 100644 cres/venv/lib/python3.8/site-packages/msgpack-0.6.2.dist-info/LICENSE.txt create mode 100644 cres/venv/lib/python3.8/site-packages/msgpack-0.6.2.dist-info/METADATA create mode 100644 cres/venv/lib/python3.8/site-packages/msgpack-0.6.2.dist-info/RECORD create mode 100644 cres/venv/lib/python3.8/site-packages/msgpack-0.6.2.dist-info/WHEEL create mode 100644 cres/venv/lib/python3.8/site-packages/msgpack-0.6.2.dist-info/top_level.txt create mode 100644 cres/venv/lib/python3.8/site-packages/msgpack-0.6.2.virtualenv create mode 100644 cres/venv/lib/python3.8/site-packages/msgpack/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/msgpack/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/msgpack/__pycache__/_version.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/msgpack/__pycache__/exceptions.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/msgpack/_cmsgpack.cpython-38-x86_64-linux-gnu.so create mode 100644 cres/venv/lib/python3.8/site-packages/msgpack/_version.py create mode 100644 cres/venv/lib/python3.8/site-packages/msgpack/exceptions.py create mode 100644 cres/venv/lib/python3.8/site-packages/msgpack/fallback.py create mode 100644 cres/venv/lib/python3.8/site-packages/packaging-20.3.dist-info/AUTHORS.txt create mode 100644 cres/venv/lib/python3.8/site-packages/packaging-20.3.dist-info/INSTALLER create mode 100644 cres/venv/lib/python3.8/site-packages/packaging-20.3.dist-info/LICENSE.txt create mode 100644 cres/venv/lib/python3.8/site-packages/packaging-20.3.dist-info/METADATA create mode 100644 cres/venv/lib/python3.8/site-packages/packaging-20.3.dist-info/RECORD create mode 100644 cres/venv/lib/python3.8/site-packages/packaging-20.3.dist-info/WHEEL create mode 100644 cres/venv/lib/python3.8/site-packages/packaging-20.3.dist-info/top_level.txt create mode 100644 cres/venv/lib/python3.8/site-packages/packaging-20.3.virtualenv create mode 100644 cres/venv/lib/python3.8/site-packages/packaging/__about__.py create mode 100644 cres/venv/lib/python3.8/site-packages/packaging/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/packaging/__pycache__/__about__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/packaging/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/packaging/__pycache__/_compat.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/packaging/__pycache__/_structures.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/packaging/__pycache__/_typing.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/packaging/__pycache__/markers.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/packaging/__pycache__/requirements.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/packaging/__pycache__/specifiers.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/packaging/__pycache__/tags.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/packaging/__pycache__/utils.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/packaging/__pycache__/version.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/packaging/_compat.py create mode 100644 cres/venv/lib/python3.8/site-packages/packaging/_structures.py create mode 100644 cres/venv/lib/python3.8/site-packages/packaging/_typing.py create mode 100644 cres/venv/lib/python3.8/site-packages/packaging/markers.py create mode 100644 cres/venv/lib/python3.8/site-packages/packaging/py.typed create mode 100644 cres/venv/lib/python3.8/site-packages/packaging/requirements.py create mode 100644 cres/venv/lib/python3.8/site-packages/packaging/specifiers.py create mode 100644 cres/venv/lib/python3.8/site-packages/packaging/tags.py create mode 100644 cres/venv/lib/python3.8/site-packages/packaging/utils.py create mode 100644 cres/venv/lib/python3.8/site-packages/packaging/version.py create mode 100644 cres/venv/lib/python3.8/site-packages/pep517-0.8.2.dist-info/AUTHORS.txt create mode 100644 cres/venv/lib/python3.8/site-packages/pep517-0.8.2.dist-info/INSTALLER create mode 100644 cres/venv/lib/python3.8/site-packages/pep517-0.8.2.dist-info/LICENSE.txt create mode 100644 cres/venv/lib/python3.8/site-packages/pep517-0.8.2.dist-info/METADATA create mode 100644 cres/venv/lib/python3.8/site-packages/pep517-0.8.2.dist-info/RECORD create mode 100644 cres/venv/lib/python3.8/site-packages/pep517-0.8.2.dist-info/WHEEL create mode 100644 cres/venv/lib/python3.8/site-packages/pep517-0.8.2.dist-info/top_level.txt create mode 100644 cres/venv/lib/python3.8/site-packages/pep517-0.8.2.virtualenv create mode 100644 cres/venv/lib/python3.8/site-packages/pep517/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/pep517/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pep517/__pycache__/compat.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pep517/__pycache__/wrappers.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pep517/_in_process.py create mode 100644 cres/venv/lib/python3.8/site-packages/pep517/build.py create mode 100644 cres/venv/lib/python3.8/site-packages/pep517/check.py create mode 100644 cres/venv/lib/python3.8/site-packages/pep517/colorlog.py create mode 100644 cres/venv/lib/python3.8/site-packages/pep517/compat.py create mode 100644 cres/venv/lib/python3.8/site-packages/pep517/dirtools.py create mode 100644 cres/venv/lib/python3.8/site-packages/pep517/envbuild.py create mode 100644 cres/venv/lib/python3.8/site-packages/pep517/meta.py create mode 100644 cres/venv/lib/python3.8/site-packages/pep517/wrappers.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip-20.0.2.dist-info/INSTALLER create mode 100644 cres/venv/lib/python3.8/site-packages/pip-20.0.2.dist-info/LICENSE.txt create mode 100644 cres/venv/lib/python3.8/site-packages/pip-20.0.2.dist-info/METADATA create mode 100644 cres/venv/lib/python3.8/site-packages/pip-20.0.2.dist-info/RECORD create mode 100644 cres/venv/lib/python3.8/site-packages/pip-20.0.2.dist-info/WHEEL create mode 100644 cres/venv/lib/python3.8/site-packages/pip-20.0.2.dist-info/entry_points.txt create mode 100644 cres/venv/lib/python3.8/site-packages/pip-20.0.2.dist-info/top_level.txt create mode 100644 cres/venv/lib/python3.8/site-packages/pip-20.0.2.virtualenv create mode 100644 cres/venv/lib/python3.8/site-packages/pip/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/__main__.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/__pycache__/build_env.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/__pycache__/cache.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/__pycache__/configuration.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/__pycache__/exceptions.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/__pycache__/legacy_resolve.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/__pycache__/locations.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/__pycache__/pep425tags.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/__pycache__/pyproject.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/build_env.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/cache.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/cli/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/main.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/parser.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/cli/base_command.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/cli/command_context.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/cli/main.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/cli/main_parser.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/cli/parser.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/cli/req_command.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/cli/status_codes.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/commands/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/commands/__pycache__/install.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/commands/__pycache__/search.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/commands/check.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/commands/completion.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/commands/configuration.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/commands/debug.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/commands/download.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/commands/freeze.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/commands/hash.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/commands/help.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/commands/install.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/commands/list.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/commands/search.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/commands/show.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/commands/uninstall.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/commands/wheel.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/configuration.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/distributions/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/distributions/__pycache__/base.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/distributions/base.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/distributions/installed.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/distributions/sdist.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/distributions/wheel.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/exceptions.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/index/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/index/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/index/__pycache__/collector.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/index/collector.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/index/package_finder.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/legacy_resolve.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/locations.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/main.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/models/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/models/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/models/__pycache__/candidate.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/models/__pycache__/format_control.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/models/__pycache__/index.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/models/__pycache__/link.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/models/__pycache__/scheme.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/models/__pycache__/target_python.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/models/__pycache__/wheel.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/models/candidate.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/models/format_control.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/models/index.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/models/link.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/models/scheme.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/models/search_scope.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/models/selection_prefs.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/models/target_python.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/models/wheel.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/network/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/network/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/network/__pycache__/auth.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/network/__pycache__/cache.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/network/__pycache__/download.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/network/__pycache__/session.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/network/__pycache__/utils.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/network/auth.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/network/cache.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/network/download.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/network/session.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/network/utils.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/network/xmlrpc.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/operations/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/operations/__pycache__/check.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/operations/build/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/operations/build/metadata.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/operations/build/metadata_legacy.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/operations/build/wheel.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/operations/build/wheel_legacy.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/operations/check.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/operations/freeze.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/operations/install/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/operations/install/__pycache__/legacy.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/operations/install/editable_legacy.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/operations/install/legacy.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/operations/install/wheel.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/operations/prepare.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/pep425tags.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/pyproject.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/req/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/req/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/req/__pycache__/constructors.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/req/__pycache__/req_file.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/req/__pycache__/req_install.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/req/__pycache__/req_set.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/req/constructors.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/req/req_file.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/req/req_install.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/req/req_set.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/req/req_tracker.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/self_outdated_check.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/compat.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/distutils_args.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/inject_securetransport.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/logging.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/marker_files.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/misc.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/models.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/pkg_resources.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/typing.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/ui.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/urls.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/appdirs.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/compat.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/deprecation.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/distutils_args.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/encoding.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/entrypoints.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/filesystem.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/filetypes.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/glibc.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/hashes.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/inject_securetransport.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/logging.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/marker_files.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/misc.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/models.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/packaging.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/pkg_resources.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/subprocess.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/typing.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/ui.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/unpacking.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/urls.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/virtualenv.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/utils/wheel.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/vcs/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/vcs/__pycache__/git.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/vcs/git.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/vcs/subversion.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/vcs/versioncontrol.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_internal/wheel_builder.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_vendor/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/pip/_vendor/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pkg_resources-0.0.0.dist-info/AUTHORS.txt create mode 100644 cres/venv/lib/python3.8/site-packages/pkg_resources-0.0.0.dist-info/INSTALLER create mode 100644 cres/venv/lib/python3.8/site-packages/pkg_resources-0.0.0.dist-info/LICENSE.txt create mode 100644 cres/venv/lib/python3.8/site-packages/pkg_resources-0.0.0.dist-info/METADATA create mode 100644 cres/venv/lib/python3.8/site-packages/pkg_resources-0.0.0.dist-info/RECORD create mode 100644 cres/venv/lib/python3.8/site-packages/pkg_resources-0.0.0.dist-info/WHEEL create mode 100644 cres/venv/lib/python3.8/site-packages/pkg_resources-0.0.0.virtualenv create mode 100644 cres/venv/lib/python3.8/site-packages/pkg_resources/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/pkg_resources/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pkg_resources/__pycache__/py31compat.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pkg_resources/_vendor/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pkg_resources/_vendor/__pycache__/six.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pkg_resources/_vendor/appdirs.py create mode 100644 cres/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__about__.py create mode 100644 cres/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/_compat.py create mode 100644 cres/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/_structures.py create mode 100644 cres/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/markers.py create mode 100644 cres/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/requirements.py create mode 100644 cres/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/specifiers.py create mode 100644 cres/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/utils.py create mode 100644 cres/venv/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/version.py create mode 100644 cres/venv/lib/python3.8/site-packages/pkg_resources/_vendor/pyparsing.py create mode 100644 cres/venv/lib/python3.8/site-packages/pkg_resources/_vendor/six.py create mode 100644 cres/venv/lib/python3.8/site-packages/pkg_resources/extern/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pkg_resources/py31compat.py create mode 100644 cres/venv/lib/python3.8/site-packages/progress-1.5.dist-info/AUTHORS.txt create mode 100644 cres/venv/lib/python3.8/site-packages/progress-1.5.dist-info/INSTALLER create mode 100644 cres/venv/lib/python3.8/site-packages/progress-1.5.dist-info/LICENSE.txt create mode 100644 cres/venv/lib/python3.8/site-packages/progress-1.5.dist-info/METADATA create mode 100644 cres/venv/lib/python3.8/site-packages/progress-1.5.dist-info/RECORD create mode 100644 cres/venv/lib/python3.8/site-packages/progress-1.5.dist-info/WHEEL create mode 100644 cres/venv/lib/python3.8/site-packages/progress-1.5.dist-info/top_level.txt create mode 100644 cres/venv/lib/python3.8/site-packages/progress-1.5.virtualenv create mode 100644 cres/venv/lib/python3.8/site-packages/progress/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/progress/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/progress/__pycache__/bar.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/progress/__pycache__/spinner.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/progress/bar.py create mode 100644 cres/venv/lib/python3.8/site-packages/progress/counter.py create mode 100644 cres/venv/lib/python3.8/site-packages/progress/spinner.py create mode 100644 cres/venv/lib/python3.8/site-packages/pyparsing-2.4.6.dist-info/AUTHORS.txt create mode 100644 cres/venv/lib/python3.8/site-packages/pyparsing-2.4.6.dist-info/INSTALLER create mode 100644 cres/venv/lib/python3.8/site-packages/pyparsing-2.4.6.dist-info/LICENSE.txt create mode 100644 cres/venv/lib/python3.8/site-packages/pyparsing-2.4.6.dist-info/METADATA create mode 100644 cres/venv/lib/python3.8/site-packages/pyparsing-2.4.6.dist-info/RECORD create mode 100644 cres/venv/lib/python3.8/site-packages/pyparsing-2.4.6.dist-info/WHEEL create mode 100644 cres/venv/lib/python3.8/site-packages/pyparsing-2.4.6.dist-info/top_level.txt create mode 100644 cres/venv/lib/python3.8/site-packages/pyparsing-2.4.6.virtualenv create mode 100644 cres/venv/lib/python3.8/site-packages/pyparsing.py create mode 100644 cres/venv/lib/python3.8/site-packages/pytoml-0.1.21.dist-info/AUTHORS.txt create mode 100644 cres/venv/lib/python3.8/site-packages/pytoml-0.1.21.dist-info/INSTALLER create mode 100644 cres/venv/lib/python3.8/site-packages/pytoml-0.1.21.dist-info/LICENSE.txt create mode 100644 cres/venv/lib/python3.8/site-packages/pytoml-0.1.21.dist-info/METADATA create mode 100644 cres/venv/lib/python3.8/site-packages/pytoml-0.1.21.dist-info/RECORD create mode 100644 cres/venv/lib/python3.8/site-packages/pytoml-0.1.21.dist-info/WHEEL create mode 100644 cres/venv/lib/python3.8/site-packages/pytoml-0.1.21.dist-info/top_level.txt create mode 100644 cres/venv/lib/python3.8/site-packages/pytoml-0.1.21.virtualenv create mode 100644 cres/venv/lib/python3.8/site-packages/pytoml/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/pytoml/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pytoml/__pycache__/core.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pytoml/__pycache__/parser.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pytoml/__pycache__/test.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pytoml/__pycache__/utils.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pytoml/__pycache__/writer.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/pytoml/core.py create mode 100644 cres/venv/lib/python3.8/site-packages/pytoml/parser.py create mode 100644 cres/venv/lib/python3.8/site-packages/pytoml/test.py create mode 100644 cres/venv/lib/python3.8/site-packages/pytoml/utils.py create mode 100644 cres/venv/lib/python3.8/site-packages/pytoml/writer.py create mode 100644 cres/venv/lib/python3.8/site-packages/requests-2.22.0.dist-info/AUTHORS.txt create mode 100644 cres/venv/lib/python3.8/site-packages/requests-2.22.0.dist-info/INSTALLER create mode 100644 cres/venv/lib/python3.8/site-packages/requests-2.22.0.dist-info/LICENSE.txt create mode 100644 cres/venv/lib/python3.8/site-packages/requests-2.22.0.dist-info/METADATA create mode 100644 cres/venv/lib/python3.8/site-packages/requests-2.22.0.dist-info/RECORD create mode 100644 cres/venv/lib/python3.8/site-packages/requests-2.22.0.dist-info/WHEEL create mode 100644 cres/venv/lib/python3.8/site-packages/requests-2.22.0.dist-info/top_level.txt create mode 100644 cres/venv/lib/python3.8/site-packages/requests-2.22.0.virtualenv create mode 100644 cres/venv/lib/python3.8/site-packages/requests/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/requests/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/requests/__pycache__/__version__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/requests/__pycache__/_internal_utils.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/requests/__pycache__/adapters.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/requests/__pycache__/api.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/requests/__pycache__/auth.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/requests/__pycache__/certs.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/requests/__pycache__/compat.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/requests/__pycache__/cookies.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/requests/__pycache__/exceptions.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/requests/__pycache__/hooks.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/requests/__pycache__/models.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/requests/__pycache__/packages.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/requests/__pycache__/sessions.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/requests/__pycache__/status_codes.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/requests/__pycache__/structures.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/requests/__pycache__/utils.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/requests/__version__.py create mode 100644 cres/venv/lib/python3.8/site-packages/requests/_internal_utils.py create mode 100644 cres/venv/lib/python3.8/site-packages/requests/adapters.py create mode 100644 cres/venv/lib/python3.8/site-packages/requests/api.py create mode 100644 cres/venv/lib/python3.8/site-packages/requests/auth.py create mode 100644 cres/venv/lib/python3.8/site-packages/requests/certs.py create mode 100644 cres/venv/lib/python3.8/site-packages/requests/compat.py create mode 100644 cres/venv/lib/python3.8/site-packages/requests/cookies.py create mode 100644 cres/venv/lib/python3.8/site-packages/requests/exceptions.py create mode 100644 cres/venv/lib/python3.8/site-packages/requests/help.py create mode 100644 cres/venv/lib/python3.8/site-packages/requests/hooks.py create mode 100644 cres/venv/lib/python3.8/site-packages/requests/models.py create mode 100644 cres/venv/lib/python3.8/site-packages/requests/packages.py create mode 100644 cres/venv/lib/python3.8/site-packages/requests/sessions.py create mode 100644 cres/venv/lib/python3.8/site-packages/requests/status_codes.py create mode 100644 cres/venv/lib/python3.8/site-packages/requests/structures.py create mode 100644 cres/venv/lib/python3.8/site-packages/requests/utils.py create mode 100644 cres/venv/lib/python3.8/site-packages/retrying-1.3.3.dist-info/AUTHORS.txt create mode 100644 cres/venv/lib/python3.8/site-packages/retrying-1.3.3.dist-info/INSTALLER create mode 100644 cres/venv/lib/python3.8/site-packages/retrying-1.3.3.dist-info/LICENSE.txt create mode 100644 cres/venv/lib/python3.8/site-packages/retrying-1.3.3.dist-info/METADATA create mode 100644 cres/venv/lib/python3.8/site-packages/retrying-1.3.3.dist-info/RECORD create mode 100644 cres/venv/lib/python3.8/site-packages/retrying-1.3.3.dist-info/WHEEL create mode 100644 cres/venv/lib/python3.8/site-packages/retrying-1.3.3.dist-info/top_level.txt create mode 100644 cres/venv/lib/python3.8/site-packages/retrying-1.3.3.virtualenv create mode 100644 cres/venv/lib/python3.8/site-packages/retrying.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools-44.0.0.dist-info/AUTHORS.txt create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools-44.0.0.dist-info/INSTALLER create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools-44.0.0.dist-info/LICENSE.txt create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools-44.0.0.dist-info/METADATA create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools-44.0.0.dist-info/RECORD create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools-44.0.0.dist-info/WHEEL create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools-44.0.0.dist-info/dependency_links.txt create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools-44.0.0.dist-info/entry_points.txt create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools-44.0.0.dist-info/top_level.txt create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools-44.0.0.dist-info/zip-safe create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools-44.0.0.virtualenv create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/__pycache__/_imp.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/__pycache__/archive_util.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/__pycache__/config.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/__pycache__/depends.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/__pycache__/dist.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/__pycache__/extension.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/__pycache__/glob.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/__pycache__/lib2to3_ex.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/__pycache__/monkey.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/__pycache__/msvc.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/__pycache__/namespaces.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/__pycache__/package_index.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/__pycache__/py27compat.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/__pycache__/py33compat.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/__pycache__/py34compat.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/__pycache__/sandbox.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/__pycache__/ssl_support.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/__pycache__/unicode_utils.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/__pycache__/version.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/__pycache__/wheel.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/__pycache__/windows_support.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/_deprecation_warning.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/_imp.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/_vendor/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/_vendor/__pycache__/ordered_set.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/_vendor/__pycache__/six.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/_vendor/ordered_set.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/__about__.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/_compat.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/tags.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/_compat.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/_structures.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/markers.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/requirements.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/specifiers.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/tags.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/utils.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/_vendor/packaging/version.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/_vendor/pyparsing.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/_vendor/six.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/archive_util.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/build_meta.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/cli-32.exe create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/cli-64.exe create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/cli.exe create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/command/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/command/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/command/__pycache__/build_py.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/command/__pycache__/easy_install.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/command/__pycache__/egg_info.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/command/__pycache__/install.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/command/__pycache__/install_lib.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/command/__pycache__/install_scripts.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/command/__pycache__/py36compat.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/command/__pycache__/sdist.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/command/__pycache__/setopt.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/command/alias.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/command/bdist_egg.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/command/bdist_rpm.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/command/bdist_wininst.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/command/build_clib.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/command/build_ext.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/command/build_py.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/command/develop.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/command/dist_info.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/command/easy_install.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/command/egg_info.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/command/install.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/command/install_egg_info.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/command/install_lib.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/command/install_scripts.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/command/launcher manifest.xml create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/command/py36compat.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/command/register.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/command/rotate.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/command/saveopts.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/command/sdist.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/command/setopt.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/command/test.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/command/upload.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/command/upload_docs.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/config.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/dep_util.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/depends.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/dist.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/errors.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/extension.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/extern/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/extern/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/glob.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/gui-32.exe create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/gui-64.exe create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/gui.exe create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/installer.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/launch.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/lib2to3_ex.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/monkey.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/msvc.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/namespaces.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/package_index.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/py27compat.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/py31compat.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/py33compat.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/py34compat.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/sandbox.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/script (dev).tmpl create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/script.tmpl create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/site-patch.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/ssl_support.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/unicode_utils.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/version.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/wheel.py create mode 100644 cres/venv/lib/python3.8/site-packages/setuptools/windows_support.py create mode 100644 cres/venv/lib/python3.8/site-packages/six-1.14.0.dist-info/AUTHORS.txt create mode 100644 cres/venv/lib/python3.8/site-packages/six-1.14.0.dist-info/INSTALLER create mode 100644 cres/venv/lib/python3.8/site-packages/six-1.14.0.dist-info/LICENSE.txt create mode 100644 cres/venv/lib/python3.8/site-packages/six-1.14.0.dist-info/METADATA create mode 100644 cres/venv/lib/python3.8/site-packages/six-1.14.0.dist-info/RECORD create mode 100644 cres/venv/lib/python3.8/site-packages/six-1.14.0.dist-info/WHEEL create mode 100644 cres/venv/lib/python3.8/site-packages/six-1.14.0.dist-info/top_level.txt create mode 100644 cres/venv/lib/python3.8/site-packages/six-1.14.0.virtualenv create mode 100644 cres/venv/lib/python3.8/site-packages/six.py create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/AUTHORS.txt create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/INSTALLER create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/LICENSE.txt create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/METADATA create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/RECORD create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/WHEEL create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3-1.25.8.dist-info/top_level.txt create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3-1.25.8.virtualenv create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/__pycache__/_collections.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/__pycache__/connection.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/__pycache__/connectionpool.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/__pycache__/exceptions.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/__pycache__/fields.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/__pycache__/filepost.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/__pycache__/poolmanager.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/__pycache__/request.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/__pycache__/response.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/_collections.py create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/connection.py create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/connectionpool.py create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/contrib/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/contrib/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/contrib/__pycache__/_appengine_environ.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/contrib/__pycache__/ntlmpool.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/contrib/__pycache__/pyopenssl.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/contrib/__pycache__/socks.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/contrib/_appengine_environ.py create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/contrib/_securetransport/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/contrib/_securetransport/bindings.py create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/contrib/_securetransport/low_level.py create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/contrib/appengine.py create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/contrib/ntlmpool.py create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/contrib/pyopenssl.py create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/contrib/securetransport.py create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/contrib/socks.py create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/exceptions.py create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/fields.py create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/filepost.py create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/packages/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/packages/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/packages/backports/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/packages/backports/makefile.py create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/packages/ssl_match_hostname/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/packages/ssl_match_hostname/_implementation.py create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/poolmanager.py create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/request.py create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/response.py create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/util/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/util/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/util/__pycache__/connection.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/util/__pycache__/queue.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/util/__pycache__/request.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/util/__pycache__/response.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/util/__pycache__/retry.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/util/__pycache__/ssl_.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/util/__pycache__/timeout.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/util/__pycache__/url.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/util/__pycache__/wait.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/util/connection.py create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/util/queue.py create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/util/request.py create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/util/response.py create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/util/retry.py create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/util/ssl_.py create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/util/timeout.py create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/util/url.py create mode 100644 cres/venv/lib/python3.8/site-packages/urllib3/util/wait.py create mode 100644 cres/venv/lib/python3.8/site-packages/webencodings-0.5.1.dist-info/AUTHORS.txt create mode 100644 cres/venv/lib/python3.8/site-packages/webencodings-0.5.1.dist-info/INSTALLER create mode 100644 cres/venv/lib/python3.8/site-packages/webencodings-0.5.1.dist-info/LICENSE.txt create mode 100644 cres/venv/lib/python3.8/site-packages/webencodings-0.5.1.dist-info/METADATA create mode 100644 cres/venv/lib/python3.8/site-packages/webencodings-0.5.1.dist-info/RECORD create mode 100644 cres/venv/lib/python3.8/site-packages/webencodings-0.5.1.dist-info/WHEEL create mode 100644 cres/venv/lib/python3.8/site-packages/webencodings-0.5.1.dist-info/top_level.txt create mode 100644 cres/venv/lib/python3.8/site-packages/webencodings-0.5.1.virtualenv create mode 100644 cres/venv/lib/python3.8/site-packages/webencodings/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/webencodings/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/webencodings/__pycache__/labels.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/webencodings/labels.py create mode 100644 cres/venv/lib/python3.8/site-packages/webencodings/mklabels.py create mode 100644 cres/venv/lib/python3.8/site-packages/webencodings/tests.py create mode 100644 cres/venv/lib/python3.8/site-packages/webencodings/x_user_defined.py create mode 100644 cres/venv/lib/python3.8/site-packages/wheel-0.34.2.dist-info/AUTHORS.txt create mode 100644 cres/venv/lib/python3.8/site-packages/wheel-0.34.2.dist-info/INSTALLER create mode 100644 cres/venv/lib/python3.8/site-packages/wheel-0.34.2.dist-info/LICENSE.txt create mode 100644 cres/venv/lib/python3.8/site-packages/wheel-0.34.2.dist-info/METADATA create mode 100644 cres/venv/lib/python3.8/site-packages/wheel-0.34.2.dist-info/RECORD create mode 100644 cres/venv/lib/python3.8/site-packages/wheel-0.34.2.dist-info/WHEEL create mode 100644 cres/venv/lib/python3.8/site-packages/wheel-0.34.2.dist-info/entry_points.txt create mode 100644 cres/venv/lib/python3.8/site-packages/wheel-0.34.2.dist-info/top_level.txt create mode 100644 cres/venv/lib/python3.8/site-packages/wheel-0.34.2.virtualenv create mode 100644 cres/venv/lib/python3.8/site-packages/wheel/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/wheel/__main__.py create mode 100644 cres/venv/lib/python3.8/site-packages/wheel/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/wheel/__pycache__/bdist_wheel.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/wheel/__pycache__/macosx_libfile.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/wheel/__pycache__/metadata.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/wheel/__pycache__/pep425tags.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/wheel/__pycache__/pkginfo.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/wheel/__pycache__/util.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/wheel/__pycache__/wheelfile.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/wheel/_version.py create mode 100644 cres/venv/lib/python3.8/site-packages/wheel/bdist_wheel.py create mode 100644 cres/venv/lib/python3.8/site-packages/wheel/cli/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/wheel/cli/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/wheel/cli/convert.py create mode 100644 cres/venv/lib/python3.8/site-packages/wheel/cli/pack.py create mode 100644 cres/venv/lib/python3.8/site-packages/wheel/cli/unpack.py create mode 100644 cres/venv/lib/python3.8/site-packages/wheel/macosx_libfile.py create mode 100644 cres/venv/lib/python3.8/site-packages/wheel/metadata.py create mode 100644 cres/venv/lib/python3.8/site-packages/wheel/pep425tags.py create mode 100644 cres/venv/lib/python3.8/site-packages/wheel/pkginfo.py create mode 100644 cres/venv/lib/python3.8/site-packages/wheel/util.py create mode 100644 cres/venv/lib/python3.8/site-packages/wheel/wheelfile.py create mode 100644 cres/venv/lib/python3.8/site-packages/yaml/__init__.py create mode 100644 cres/venv/lib/python3.8/site-packages/yaml/__pycache__/__init__.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/yaml/__pycache__/composer.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/yaml/__pycache__/constructor.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/yaml/__pycache__/cyaml.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/yaml/__pycache__/dumper.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/yaml/__pycache__/emitter.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/yaml/__pycache__/error.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/yaml/__pycache__/events.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/yaml/__pycache__/loader.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/yaml/__pycache__/nodes.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/yaml/__pycache__/parser.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/yaml/__pycache__/reader.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/yaml/__pycache__/representer.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/yaml/__pycache__/resolver.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/yaml/__pycache__/scanner.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/yaml/__pycache__/serializer.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/yaml/__pycache__/tokens.cpython-38.pyc create mode 100644 cres/venv/lib/python3.8/site-packages/yaml/composer.py create mode 100644 cres/venv/lib/python3.8/site-packages/yaml/constructor.py create mode 100644 cres/venv/lib/python3.8/site-packages/yaml/cyaml.py create mode 100644 cres/venv/lib/python3.8/site-packages/yaml/dumper.py create mode 100644 cres/venv/lib/python3.8/site-packages/yaml/emitter.py create mode 100644 cres/venv/lib/python3.8/site-packages/yaml/error.py create mode 100644 cres/venv/lib/python3.8/site-packages/yaml/events.py create mode 100644 cres/venv/lib/python3.8/site-packages/yaml/loader.py create mode 100644 cres/venv/lib/python3.8/site-packages/yaml/nodes.py create mode 100644 cres/venv/lib/python3.8/site-packages/yaml/parser.py create mode 100644 cres/venv/lib/python3.8/site-packages/yaml/reader.py create mode 100644 cres/venv/lib/python3.8/site-packages/yaml/representer.py create mode 100644 cres/venv/lib/python3.8/site-packages/yaml/resolver.py create mode 100644 cres/venv/lib/python3.8/site-packages/yaml/scanner.py create mode 100644 cres/venv/lib/python3.8/site-packages/yaml/serializer.py create mode 100644 cres/venv/lib/python3.8/site-packages/yaml/tokens.py create mode 100644 cres/venv/pyvenv.cfg diff --git a/cres/venv/bin/activate b/cres/venv/bin/activate new file mode 100644 index 000000000..db742ea7b --- /dev/null +++ b/cres/venv/bin/activate @@ -0,0 +1,84 @@ +# This file must be used with "source bin/activate" *from bash* +# you cannot run it directly + + +if [ "${BASH_SOURCE-}" = "$0" ]; then + echo "You must source this script: \$ source $0" >&2 + exit 33 +fi + +deactivate () { + unset -f pydoc >/dev/null 2>&1 + + # reset old environment variables + # ! [ -z ${VAR+_} ] returns true if VAR is declared at all + if ! [ -z "${_OLD_VIRTUAL_PATH:+_}" ] ; then + PATH="$_OLD_VIRTUAL_PATH" + export PATH + unset _OLD_VIRTUAL_PATH + fi + if ! [ -z "${_OLD_VIRTUAL_PYTHONHOME+_}" ] ; then + PYTHONHOME="$_OLD_VIRTUAL_PYTHONHOME" + export PYTHONHOME + unset _OLD_VIRTUAL_PYTHONHOME + fi + + # This should detect bash and zsh, which have a hash command that must + # be called to get it to forget past commands. Without forgetting + # past commands the $PATH changes we made may not be respected + if [ -n "${BASH-}" ] || [ -n "${ZSH_VERSION-}" ] ; then + hash -r 2>/dev/null + fi + + if ! [ -z "${_OLD_VIRTUAL_PS1+_}" ] ; then + PS1="$_OLD_VIRTUAL_PS1" + export PS1 + unset _OLD_VIRTUAL_PS1 + fi + + unset VIRTUAL_ENV + if [ ! "${1-}" = "nondestructive" ] ; then + # Self destruct! + unset -f deactivate + fi +} + +# unset irrelevant variables +deactivate nondestructive + +VIRTUAL_ENV='/home/foobar/Projects/www-project-integration-standards/cres/venv' +export VIRTUAL_ENV + +_OLD_VIRTUAL_PATH="$PATH" +PATH="$VIRTUAL_ENV/bin:$PATH" +export PATH + +# unset PYTHONHOME if set +if ! [ -z "${PYTHONHOME+_}" ] ; then + _OLD_VIRTUAL_PYTHONHOME="$PYTHONHOME" + unset PYTHONHOME +fi + +if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT-}" ] ; then + _OLD_VIRTUAL_PS1="${PS1-}" + if [ "x" != x ] ; then + PS1="${PS1-}" + else + PS1="(`basename \"$VIRTUAL_ENV\"`) ${PS1-}" + fi + export PS1 +fi + +# Make sure to unalias pydoc if it's already there +alias pydoc 2>/dev/null >/dev/null && unalias pydoc || true + +pydoc () { + python -m pydoc "$@" +} + +# This should detect bash and zsh, which have a hash command that must +# be called to get it to forget past commands. Without forgetting +# past commands the $PATH changes we made may not be respected +if [ -n "${BASH-}" ] || [ -n "${ZSH_VERSION-}" ] ; then + hash -r 2>/dev/null +fi diff --git a/cres/venv/bin/activate.csh b/cres/venv/bin/activate.csh new file mode 100644 index 000000000..ad6638489 --- /dev/null +++ b/cres/venv/bin/activate.csh @@ -0,0 +1,55 @@ +# This file must be used with "source bin/activate.csh" *from csh*. +# You cannot run it directly. +# Created by Davide Di Blasi . + +set newline='\ +' + +alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH:q" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT:q" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate && unalias pydoc' + +# Unset irrelevant variables. +deactivate nondestructive + +setenv VIRTUAL_ENV '/home/foobar/Projects/www-project-integration-standards/cres/venv' + +set _OLD_VIRTUAL_PATH="$PATH:q" +setenv PATH "$VIRTUAL_ENV:q/bin:$PATH:q" + + + +if ('' != "") then + set env_name = '' +else + set env_name = '('"$VIRTUAL_ENV:t:q"') ' +endif + +if ( $?VIRTUAL_ENV_DISABLE_PROMPT ) then + if ( $VIRTUAL_ENV_DISABLE_PROMPT == "" ) then + set do_prompt = "1" + else + set do_prompt = "0" + endif +else + set do_prompt = "1" +endif + +if ( $do_prompt == "1" ) then + # Could be in a non-interactive environment, + # in which case, $prompt is undefined and we wouldn't + # care about the prompt anyway. + if ( $?prompt ) then + set _OLD_VIRTUAL_PROMPT="$prompt:q" + if ( "$prompt:q" =~ *"$newline:q"* ) then + : + else + set prompt = "$env_name:q$prompt:q" + endif + endif +endif + +unset env_name +unset do_prompt + +alias pydoc python -m pydoc + +rehash diff --git a/cres/venv/bin/activate.fish b/cres/venv/bin/activate.fish new file mode 100644 index 000000000..8792ec9e3 --- /dev/null +++ b/cres/venv/bin/activate.fish @@ -0,0 +1,100 @@ +# This file must be used using `source bin/activate.fish` *within a running fish ( http://fishshell.com ) session*. +# Do not run it directly. + +function _bashify_path -d "Converts a fish path to something bash can recognize" + set fishy_path $argv + set bashy_path $fishy_path[1] + for path_part in $fishy_path[2..-1] + set bashy_path "$bashy_path:$path_part" + end + echo $bashy_path +end + +function _fishify_path -d "Converts a bash path to something fish can recognize" + echo $argv | tr ':' '\n' +end + +function deactivate -d 'Exit virtualenv mode and return to the normal environment.' + # reset old environment variables + if test -n "$_OLD_VIRTUAL_PATH" + # https://github.com/fish-shell/fish-shell/issues/436 altered PATH handling + if test (echo $FISH_VERSION | head -c 1) -lt 3 + set -gx PATH (_fishify_path "$_OLD_VIRTUAL_PATH") + else + set -gx PATH "$_OLD_VIRTUAL_PATH" + end + set -e _OLD_VIRTUAL_PATH + end + + if test -n "$_OLD_VIRTUAL_PYTHONHOME" + set -gx PYTHONHOME "$_OLD_VIRTUAL_PYTHONHOME" + set -e _OLD_VIRTUAL_PYTHONHOME + end + + if test -n "$_OLD_FISH_PROMPT_OVERRIDE" + and functions -q _old_fish_prompt + # Set an empty local `$fish_function_path` to allow the removal of `fish_prompt` using `functions -e`. + set -l fish_function_path + + # Erase virtualenv's `fish_prompt` and restore the original. + functions -e fish_prompt + functions -c _old_fish_prompt fish_prompt + functions -e _old_fish_prompt + set -e _OLD_FISH_PROMPT_OVERRIDE + end + + set -e VIRTUAL_ENV + + if test "$argv[1]" != 'nondestructive' + # Self-destruct! + functions -e pydoc + functions -e deactivate + functions -e _bashify_path + functions -e _fishify_path + end +end + +# Unset irrelevant variables. +deactivate nondestructive + +set -gx VIRTUAL_ENV '/home/foobar/Projects/www-project-integration-standards/cres/venv' + +# https://github.com/fish-shell/fish-shell/issues/436 altered PATH handling +if test (echo $FISH_VERSION | head -c 1) -lt 3 + set -gx _OLD_VIRTUAL_PATH (_bashify_path $PATH) +else + set -gx _OLD_VIRTUAL_PATH "$PATH" +end +set -gx PATH "$VIRTUAL_ENV"'/bin' $PATH + +# Unset `$PYTHONHOME` if set. +if set -q PYTHONHOME + set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME + set -e PYTHONHOME +end + +function pydoc + python -m pydoc $argv +end + +if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" + # Copy the current `fish_prompt` function as `_old_fish_prompt`. + functions -c fish_prompt _old_fish_prompt + + function fish_prompt + # Run the user's prompt first; it might depend on (pipe)status. + set -l prompt (_old_fish_prompt) + + # Prompt override provided? + # If not, just prepend the environment name. + if test -n '' + printf '%s%s' '' (set_color normal) + else + printf '%s(%s) ' (set_color normal) (basename "$VIRTUAL_ENV") + end + + string join -- \n $prompt # handle multi-line prompts + end + + set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" +end diff --git a/cres/venv/bin/activate.ps1 b/cres/venv/bin/activate.ps1 new file mode 100644 index 000000000..95504d395 --- /dev/null +++ b/cres/venv/bin/activate.ps1 @@ -0,0 +1,60 @@ +$script:THIS_PATH = $myinvocation.mycommand.path +$script:BASE_DIR = Split-Path (Resolve-Path "$THIS_PATH/..") -Parent + +function global:deactivate([switch] $NonDestructive) { + if (Test-Path variable:_OLD_VIRTUAL_PATH) { + $env:PATH = $variable:_OLD_VIRTUAL_PATH + Remove-Variable "_OLD_VIRTUAL_PATH" -Scope global + } + + if (Test-Path function:_old_virtual_prompt) { + $function:prompt = $function:_old_virtual_prompt + Remove-Item function:\_old_virtual_prompt + } + + if ($env:VIRTUAL_ENV) { + Remove-Item env:VIRTUAL_ENV -ErrorAction SilentlyContinue + } + + if (!$NonDestructive) { + # Self destruct! + Remove-Item function:deactivate + Remove-Item function:pydoc + } +} + +function global:pydoc { + python -m pydoc $args +} + +# unset irrelevant variables +deactivate -nondestructive + +$VIRTUAL_ENV = $BASE_DIR +$env:VIRTUAL_ENV = $VIRTUAL_ENV + +New-Variable -Scope global -Name _OLD_VIRTUAL_PATH -Value $env:PATH + +$env:PATH = "$env:VIRTUAL_ENV/bin:" + $env:PATH +if (!$env:VIRTUAL_ENV_DISABLE_PROMPT) { + function global:_old_virtual_prompt { + "" + } + $function:_old_virtual_prompt = $function:prompt + + if ("" -ne "") { + function global:prompt { + # Add the custom prefix to the existing prompt + $previous_prompt_value = & $function:_old_virtual_prompt + ("" + $previous_prompt_value) + } + } + else { + function global:prompt { + # Add a prefix to the current prompt, but don't discard it. + $previous_prompt_value = & $function:_old_virtual_prompt + $new_prompt_value = "($( Split-Path $env:VIRTUAL_ENV -Leaf )) " + ($new_prompt_value + $previous_prompt_value) + } + } +} diff --git a/cres/venv/bin/activate.xsh b/cres/venv/bin/activate.xsh new file mode 100644 index 000000000..149d03d46 --- /dev/null +++ b/cres/venv/bin/activate.xsh @@ -0,0 +1,46 @@ +"""Xonsh activate script for virtualenv""" +from xonsh.tools import get_sep as _get_sep + +def _deactivate(args): + if "pydoc" in aliases: + del aliases["pydoc"] + + if ${...}.get("_OLD_VIRTUAL_PATH", ""): + $PATH = $_OLD_VIRTUAL_PATH + del $_OLD_VIRTUAL_PATH + + if ${...}.get("_OLD_VIRTUAL_PYTHONHOME", ""): + $PYTHONHOME = $_OLD_VIRTUAL_PYTHONHOME + del $_OLD_VIRTUAL_PYTHONHOME + + if "VIRTUAL_ENV" in ${...}: + del $VIRTUAL_ENV + + if "VIRTUAL_ENV_PROMPT" in ${...}: + del $VIRTUAL_ENV_PROMPT + + if "nondestructive" not in args: + # Self destruct! + del aliases["deactivate"] + + +# unset irrelevant variables +_deactivate(["nondestructive"]) +aliases["deactivate"] = _deactivate + +$VIRTUAL_ENV = r"/home/foobar/Projects/www-project-integration-standards/cres/venv" + +$_OLD_VIRTUAL_PATH = $PATH +$PATH = $PATH[:] +$PATH.add($VIRTUAL_ENV + _get_sep() + "bin", front=True, replace=True) + +if ${...}.get("PYTHONHOME", ""): + # unset PYTHONHOME if set + $_OLD_VIRTUAL_PYTHONHOME = $PYTHONHOME + del $PYTHONHOME + +$VIRTUAL_ENV_PROMPT = "" +if not $VIRTUAL_ENV_PROMPT: + del $VIRTUAL_ENV_PROMPT + +aliases["pydoc"] = ["python", "-m", "pydoc"] diff --git a/cres/venv/bin/activate_this.py b/cres/venv/bin/activate_this.py new file mode 100644 index 000000000..447998698 --- /dev/null +++ b/cres/venv/bin/activate_this.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +"""Activate virtualenv for current interpreter: + +Use exec(open(this_file).read(), {'__file__': this_file}). + +This can be used when you must use an existing Python interpreter, not the virtualenv bin/python. +""" +import os +import site +import sys + +try: + abs_file = os.path.abspath(__file__) +except NameError: + raise AssertionError("You must use exec(open(this_file).read(), {'__file__': this_file}))") + +bin_dir = os.path.dirname(abs_file) +base = bin_dir[: -len("bin") - 1] # strip away the bin part from the __file__, plus the path separator + +# prepend bin to PATH (this file is inside the bin directory) +os.environ["PATH"] = os.pathsep.join([bin_dir] + os.environ.get("PATH", "").split(os.pathsep)) +os.environ["VIRTUAL_ENV"] = base # virtual env is right above bin directory + +# add the virtual environments libraries to the host python import mechanism +prev_length = len(sys.path) +for lib in "../lib/python3.8/site-packages".split(os.pathsep): + path = os.path.realpath(os.path.join(bin_dir, lib)) + site.addsitedir(path.decode("utf-8") if "" else path) +sys.path[:] = sys.path[prev_length:] + sys.path[0:prev_length] + +sys.real_prefix = sys.prefix +sys.prefix = base diff --git a/cres/venv/bin/chardetect b/cres/venv/bin/chardetect new file mode 100755 index 000000000..33800d9a3 --- /dev/null +++ b/cres/venv/bin/chardetect @@ -0,0 +1,8 @@ +#!/home/foobar/Projects/www-project-integration-standards/cres/venv/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from chardet.cli.chardetect import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/cres/venv/bin/chardetect-3.8 b/cres/venv/bin/chardetect-3.8 new file mode 100755 index 000000000..33800d9a3 --- /dev/null +++ b/cres/venv/bin/chardetect-3.8 @@ -0,0 +1,8 @@ +#!/home/foobar/Projects/www-project-integration-standards/cres/venv/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from chardet.cli.chardetect import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/cres/venv/bin/chardetect3 b/cres/venv/bin/chardetect3 new file mode 100755 index 000000000..33800d9a3 --- /dev/null +++ b/cres/venv/bin/chardetect3 @@ -0,0 +1,8 @@ +#!/home/foobar/Projects/www-project-integration-standards/cres/venv/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from chardet.cli.chardetect import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/cres/venv/bin/distro b/cres/venv/bin/distro new file mode 100755 index 000000000..c31b98ca0 --- /dev/null +++ b/cres/venv/bin/distro @@ -0,0 +1,8 @@ +#!/home/foobar/Projects/www-project-integration-standards/cres/venv/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from distro import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/cres/venv/bin/distro-3.8 b/cres/venv/bin/distro-3.8 new file mode 100755 index 000000000..c31b98ca0 --- /dev/null +++ b/cres/venv/bin/distro-3.8 @@ -0,0 +1,8 @@ +#!/home/foobar/Projects/www-project-integration-standards/cres/venv/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from distro import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/cres/venv/bin/distro3 b/cres/venv/bin/distro3 new file mode 100755 index 000000000..c31b98ca0 --- /dev/null +++ b/cres/venv/bin/distro3 @@ -0,0 +1,8 @@ +#!/home/foobar/Projects/www-project-integration-standards/cres/venv/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from distro import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/cres/venv/bin/easy_install b/cres/venv/bin/easy_install new file mode 100755 index 000000000..a9dd5fc97 --- /dev/null +++ b/cres/venv/bin/easy_install @@ -0,0 +1,8 @@ +#!/home/foobar/Projects/www-project-integration-standards/cres/venv/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from setuptools.command.easy_install import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/cres/venv/bin/easy_install-3.8 b/cres/venv/bin/easy_install-3.8 new file mode 100755 index 000000000..a9dd5fc97 --- /dev/null +++ b/cres/venv/bin/easy_install-3.8 @@ -0,0 +1,8 @@ +#!/home/foobar/Projects/www-project-integration-standards/cres/venv/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from setuptools.command.easy_install import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/cres/venv/bin/easy_install3 b/cres/venv/bin/easy_install3 new file mode 100755 index 000000000..a9dd5fc97 --- /dev/null +++ b/cres/venv/bin/easy_install3 @@ -0,0 +1,8 @@ +#!/home/foobar/Projects/www-project-integration-standards/cres/venv/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from setuptools.command.easy_install import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/cres/venv/bin/pip b/cres/venv/bin/pip new file mode 100755 index 000000000..5f419a652 --- /dev/null +++ b/cres/venv/bin/pip @@ -0,0 +1,8 @@ +#!/home/foobar/Projects/www-project-integration-standards/cres/venv/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/cres/venv/bin/pip-3.8 b/cres/venv/bin/pip-3.8 new file mode 100755 index 000000000..5f419a652 --- /dev/null +++ b/cres/venv/bin/pip-3.8 @@ -0,0 +1,8 @@ +#!/home/foobar/Projects/www-project-integration-standards/cres/venv/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/cres/venv/bin/pip3 b/cres/venv/bin/pip3 new file mode 100755 index 000000000..5f419a652 --- /dev/null +++ b/cres/venv/bin/pip3 @@ -0,0 +1,8 @@ +#!/home/foobar/Projects/www-project-integration-standards/cres/venv/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/cres/venv/bin/pip3.8 b/cres/venv/bin/pip3.8 new file mode 100755 index 000000000..5f419a652 --- /dev/null +++ b/cres/venv/bin/pip3.8 @@ -0,0 +1,8 @@ +#!/home/foobar/Projects/www-project-integration-standards/cres/venv/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/cres/venv/bin/python b/cres/venv/bin/python new file mode 120000 index 000000000..ae65fdaa1 --- /dev/null +++ b/cres/venv/bin/python @@ -0,0 +1 @@ +/usr/bin/python3 \ No newline at end of file diff --git a/cres/venv/bin/python3 b/cres/venv/bin/python3 new file mode 120000 index 000000000..d8654aa0e --- /dev/null +++ b/cres/venv/bin/python3 @@ -0,0 +1 @@ +python \ No newline at end of file diff --git a/cres/venv/bin/python3.8 b/cres/venv/bin/python3.8 new file mode 120000 index 000000000..d8654aa0e --- /dev/null +++ b/cres/venv/bin/python3.8 @@ -0,0 +1 @@ +python \ No newline at end of file diff --git a/cres/venv/bin/wheel b/cres/venv/bin/wheel new file mode 100755 index 000000000..2a9a5cb0b --- /dev/null +++ b/cres/venv/bin/wheel @@ -0,0 +1,8 @@ +#!/home/foobar/Projects/www-project-integration-standards/cres/venv/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from wheel.cli import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/cres/venv/bin/wheel-3.8 b/cres/venv/bin/wheel-3.8 new file mode 100755 index 000000000..2a9a5cb0b --- /dev/null +++ b/cres/venv/bin/wheel-3.8 @@ -0,0 +1,8 @@ +#!/home/foobar/Projects/www-project-integration-standards/cres/venv/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from wheel.cli import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/cres/venv/bin/wheel3 b/cres/venv/bin/wheel3 new file mode 100755 index 000000000..2a9a5cb0b --- /dev/null +++ b/cres/venv/bin/wheel3 @@ -0,0 +1,8 @@ +#!/home/foobar/Projects/www-project-integration-standards/cres/venv/bin/python +# -*- coding: utf-8 -*- +import re +import sys +from wheel.cli import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/cres/venv/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/AUTHORS.txt b/cres/venv/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/AUTHORS.txt new file mode 100644 index 000000000..72c87d7d3 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/AUTHORS.txt @@ -0,0 +1,562 @@ +A_Rog +Aakanksha Agrawal <11389424+rasponic@users.noreply.github.com> +Abhinav Sagar <40603139+abhinavsagar@users.noreply.github.com> +ABHYUDAY PRATAP SINGH +abs51295 +AceGentile +Adam Chainz +Adam Tse +Adam Tse +Adam Wentz +admin +Adrien Morison +ahayrapetyan +Ahilya +AinsworthK +Akash Srivastava +Alan Yee +Albert Tugushev +Albert-Guan +albertg +Aleks Bunin +Alethea Flowers +Alex Gaynor +Alex Grönholm +Alex Loosley +Alex Morega +Alex Stachowiak +Alexander Shtyrov +Alexandre Conrad +Alexey Popravka +Alexey Popravka +Alli +Ami Fischman +Ananya Maiti +Anatoly Techtonik +Anders Kaseorg +Andreas Lutro +Andrei Geacar +Andrew Gaul +Andrey Bulgakov +Andrés Delfino <34587441+andresdelfino@users.noreply.github.com> +Andrés Delfino +Andy Freeland +Andy Freeland +Andy Kluger +Ani Hayrapetyan +Aniruddha Basak +Anish Tambe +Anrs Hu +Anthony Sottile +Antoine Musso +Anton Ovchinnikov +Anton Patrushev +Antonio Alvarado Hernandez +Antony Lee +Antti Kaihola +Anubhav Patel +Anuj Godase +AQNOUCH Mohammed +AraHaan +Arindam Choudhury +Armin Ronacher +Artem +Ashley Manton +Ashwin Ramaswami +atse +Atsushi Odagiri +Avner Cohen +Baptiste Mispelon +Barney Gale +barneygale +Bartek Ogryczak +Bastian Venthur +Ben Darnell +Ben Hoyt +Ben Rosser +Bence Nagy +Benjamin Peterson +Benjamin VanEvery +Benoit Pierre +Berker Peksag +Bernardo B. Marques +Bernhard M. Wiedemann +Bertil Hatt +Bogdan Opanchuk +BorisZZZ +Brad Erickson +Bradley Ayers +Brandon L. Reiss +Brandt Bucher +Brett Randall +Brian Cristante <33549821+brcrista@users.noreply.github.com> +Brian Cristante +Brian Rosner +BrownTruck +Bruno Oliveira +Bruno Renié +Bstrdsmkr +Buck Golemon +burrows +Bussonnier Matthias +c22 +Caleb Martinez +Calvin Smith +Carl Meyer +Carlos Liam +Carol Willing +Carter Thayer +Cass +Chandrasekhar Atina +Chih-Hsuan Yen +Chih-Hsuan Yen +Chris Brinker +Chris Hunt +Chris Jerdonek +Chris McDonough +Chris Wolfe +Christian Heimes +Christian Oudard +Christopher Hunt +Christopher Snyder +Clark Boylan +Clay McClure +Cody +Cody Soyland +Colin Watson +Connor Osborn +Cooper Lees +Cooper Ry Lees +Cory Benfield +Cory Wright +Craig Kerstiens +Cristian Sorinel +Curtis Doty +cytolentino +Damian Quiroga +Dan Black +Dan Savilonis +Dan Sully +daniel +Daniel Collins +Daniel Hahler +Daniel Holth +Daniel Jost +Daniel Shaulov +Daniele Esposti +Daniele Procida +Danny Hermes +Dav Clark +Dave Abrahams +Dave Jones +David Aguilar +David Black +David Bordeynik +David Bordeynik +David Caro +David Evans +David Linke +David Pursehouse +David Tucker +David Wales +Davidovich +derwolfe +Desetude +Diego Caraballo +DiegoCaraballo +Dmitry Gladkov +Domen Kožar +Donald Stufft +Dongweiming +Douglas Thor +DrFeathers +Dustin Ingram +Dwayne Bailey +Ed Morley <501702+edmorley@users.noreply.github.com> +Ed Morley +Eitan Adler +ekristina +elainechan +Eli Schwartz +Eli Schwartz +Emil Burzo +Emil Styrke +Endoh Takanao +enoch +Erdinc Mutlu +Eric Gillingham +Eric Hanchrow +Eric Hopper +Erik M. Bray +Erik Rose +Ernest W Durbin III +Ernest W. Durbin III +Erwin Janssen +Eugene Vereshchagin +everdimension +Felix Yan +fiber-space +Filip Kokosiński +Florian Briand +Florian Rathgeber +Francesco +Francesco Montesano +Frost Ming +Gabriel Curio +Gabriel de Perthuis +Garry Polley +gdanielson +Geoffrey Lehée +Geoffrey Sneddon +George Song +Georgi Valkov +Giftlin Rajaiah +gizmoguy1 +gkdoc <40815324+gkdoc@users.noreply.github.com> +Gopinath M <31352222+mgopi1990@users.noreply.github.com> +GOTO Hayato <3532528+gh640@users.noreply.github.com> +gpiks +Guilherme Espada +Guy Rozendorn +gzpan123 +Hanjun Kim +Hari Charan +Harsh Vardhan +Herbert Pfennig +Hsiaoming Yang +Hugo +Hugo Lopes Tavares +Hugo van Kemenade +hugovk +Hynek Schlawack +Ian Bicking +Ian Cordasco +Ian Lee +Ian Stapleton Cordasco +Ian Wienand +Ian Wienand +Igor Kuzmitshov +Igor Sobreira +Ilya Baryshev +INADA Naoki +Ionel Cristian Mărieș +Ionel Maries Cristian +Ivan Pozdeev +Jacob Kim +jakirkham +Jakub Stasiak +Jakub Vysoky +Jakub Wilk +James Cleveland +James Cleveland +James Firth +James Polley +Jan Pokorný +Jannis Leidel +jarondl +Jason R. Coombs +Jay Graves +Jean-Christophe Fillion-Robin +Jeff Barber +Jeff Dairiki +Jelmer Vernooij +jenix21 +Jeremy Stanley +Jeremy Zafran +Jiashuo Li +Jim Garrison +Jivan Amara +John Paton +John-Scott Atlakson +johnthagen +johnthagen +Jon Banafato +Jon Dufresne +Jon Parise +Jonas Nockert +Jonathan Herbert +Joost Molenaar +Jorge Niedbalski +Joseph Long +Josh Bronson +Josh Hansen +Josh Schneier +Juanjo Bazán +Julian Berman +Julian Gethmann +Julien Demoor +jwg4 +Jyrki Pulliainen +Kai Chen +Kamal Bin Mustafa +kaustav haldar +keanemind +Keith Maxwell +Kelsey Hightower +Kenneth Belitzky +Kenneth Reitz +Kenneth Reitz +Kevin Burke +Kevin Carter +Kevin Frommelt +Kevin R Patterson +Kexuan Sun +Kit Randel +kpinc +Krishna Oza +Kumar McMillan +Kyle Persohn +lakshmanaram +Laszlo Kiss-Kollar +Laurent Bristiel +Laurie Opperman +Leon Sasson +Lev Givon +Lincoln de Sousa +Lipis +Loren Carvalho +Lucas Cimon +Ludovic Gasc +Luke Macken +Luo Jiebin +luojiebin +luz.paz +László Kiss Kollár +László Kiss Kollár +Marc Abramowitz +Marc Tamlyn +Marcus Smith +Mariatta +Mark Kohler +Mark Williams +Mark Williams +Markus Hametner +Masaki +Masklinn +Matej Stuchlik +Mathew Jennings +Mathieu Bridon +Matt Good +Matt Maker +Matt Robenolt +matthew +Matthew Einhorn +Matthew Gilliard +Matthew Iversen +Matthew Trumbell +Matthew Willson +Matthias Bussonnier +mattip +Maxim Kurnikov +Maxime Rouyrre +mayeut +mbaluna <44498973+mbaluna@users.noreply.github.com> +mdebi <17590103+mdebi@users.noreply.github.com> +memoselyk +Michael +Michael Aquilina +Michael E. Karpeles +Michael Klich +Michael Williamson +michaelpacer +Mickaël Schoentgen +Miguel Araujo Perez +Mihir Singh +Mike +Mike Hendricks +Min RK +MinRK +Miro Hrončok +Monica Baluna +montefra +Monty Taylor +Nate Coraor +Nathaniel J. Smith +Nehal J Wani +Neil Botelho +Nick Coghlan +Nick Stenning +Nick Timkovich +Nicolas Bock +Nikhil Benesch +Nitesh Sharma +Nowell Strite +NtaleGrey +nvdv +Ofekmeister +ofrinevo +Oliver Jeeves +Oliver Tonnhofer +Olivier Girardot +Olivier Grisel +Ollie Rutherfurd +OMOTO Kenji +Omry Yadan +Oren Held +Oscar Benjamin +Oz N Tiram +Pachwenko <32424503+Pachwenko@users.noreply.github.com> +Patrick Dubroy +Patrick Jenkins +Patrick Lawson +patricktokeeffe +Patrik Kopkan +Paul Kehrer +Paul Moore +Paul Nasrat +Paul Oswald +Paul van der Linden +Paulus Schoutsen +Pavithra Eswaramoorthy <33131404+QueenCoffee@users.noreply.github.com> +Pawel Jasinski +Pekka Klärck +Peter Lisák +Peter Waller +petr-tik +Phaneendra Chiruvella +Phil Freo +Phil Pennock +Phil Whelan +Philip Jägenstedt +Philip Molloy +Philippe Ombredanne +Pi Delport +Pierre-Yves Rofes +pip +Prabakaran Kumaresshan +Prabhjyotsing Surjit Singh Sodhi +Prabhu Marappan +Pradyun Gedam +Pratik Mallya +Preet Thakkar +Preston Holmes +Przemek Wrzos +Pulkit Goyal <7895pulkit@gmail.com> +Qiangning Hong +Quentin Pradet +R. David Murray +Rafael Caricio +Ralf Schmitt +Razzi Abuissa +rdb +Remi Rampin +Remi Rampin +Rene Dudfield +Riccardo Magliocchetti +Richard Jones +RobberPhex +Robert Collins +Robert McGibbon +Robert T. McGibbon +robin elisha robinson +Roey Berman +Rohan Jain +Rohan Jain +Rohan Jain +Roman Bogorodskiy +Romuald Brunet +Ronny Pfannschmidt +Rory McCann +Ross Brattain +Roy Wellington Ⅳ +Roy Wellington Ⅳ +Ryan Wooden +ryneeverett +Sachi King +Salvatore Rinchiera +Savio Jomton +schlamar +Scott Kitterman +Sean +seanj +Sebastian Jordan +Sebastian Schaetz +Segev Finer +SeongSoo Cho +Sergey Vasilyev +Seth Woodworth +Shlomi Fish +Shovan Maity +Simeon Visser +Simon Cross +Simon Pichugin +sinoroc +Sorin Sbarnea +Stavros Korokithakis +Stefan Scherfke +Stephan Erb +stepshal +Steve (Gadget) Barnes +Steve Barnes +Steve Dower +Steve Kowalik +Steven Myint +stonebig +Stéphane Bidoul (ACSONE) +Stéphane Bidoul +Stéphane Klein +Sumana Harihareswara +Sviatoslav Sydorenko +Sviatoslav Sydorenko +Swat009 +Takayuki SHIMIZUKAWA +tbeswick +Thijs Triemstra +Thomas Fenzl +Thomas Grainger +Thomas Guettler +Thomas Johansson +Thomas Kluyver +Thomas Smith +Tim D. Smith +Tim Gates +Tim Harder +Tim Heap +tim smith +tinruufu +Tom Forbes +Tom Freudenheim +Tom V +Tomas Orsava +Tomer Chachamu +Tony Beswick +Tony Zhaocheng Tan +TonyBeswick +toonarmycaptain +Toshio Kuratomi +Travis Swicegood +Tzu-ping Chung +Valentin Haenel +Victor Stinner +victorvpaulo +Viktor Szépe +Ville Skyttä +Vinay Sajip +Vincent Philippon +Vinicyus Macedo <7549205+vinicyusmacedo@users.noreply.github.com> +Vitaly Babiy +Vladimir Rutsky +W. Trevor King +Wil Tan +Wilfred Hughes +William ML Leslie +William T Olson +Wilson Mo +wim glenn +Wolfgang Maier +Xavier Fernandez +Xavier Fernandez +xoviat +xtreak +YAMAMOTO Takashi +Yen Chi Hsuan +Yeray Diaz Diaz +Yoval P +Yu Jian +Yuan Jing Vincent Yan +Zearin +Zearin +Zhiping Deng +Zvezdan Petkovic +Łukasz Langa +Семён Марьясин diff --git a/cres/venv/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/INSTALLER b/cres/venv/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/INSTALLER new file mode 100644 index 000000000..a1b589e38 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/cres/venv/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/LICENSE.txt b/cres/venv/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/LICENSE.txt new file mode 100644 index 000000000..737fec5c5 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/LICENSE.txt @@ -0,0 +1,20 @@ +Copyright (c) 2008-2019 The pip developers (see AUTHORS.txt file) + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/cres/venv/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/METADATA b/cres/venv/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/METADATA new file mode 100644 index 000000000..3119fa91a --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/METADATA @@ -0,0 +1,71 @@ +Metadata-Version: 2.1 +Name: CacheControl +Version: 0.12.6 +Summary: httplib2 caching for requests +Home-page: https://github.com/ionrock/cachecontrol +Author: Eric Larson +Author-email: eric@ionrock.org +License: UNKNOWN +Keywords: requests http caching web +Platform: UNKNOWN +Classifier: Development Status :: 4 - Beta +Classifier: Environment :: Web Environment +Classifier: License :: OSI Approved :: Apache Software License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Topic :: Internet :: WWW/HTTP +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* +Provides-Extra: filecache +Requires-Dist: lockfile (>=0.9) ; extra == 'filecache' +Provides-Extra: redis +Requires-Dist: redis (>=2.10.5) ; extra == 'redis' + +============== + CacheControl +============== + +.. image:: https://img.shields.io/pypi/v/cachecontrol.svg + :target: https://pypi.python.org/pypi/cachecontrol + :alt: Latest Version + +.. image:: https://travis-ci.org/ionrock/cachecontrol.png?branch=master + :target: https://travis-ci.org/ionrock/cachecontrol + +CacheControl is a port of the caching algorithms in httplib2_ for use with +requests_ session object. + +It was written because httplib2's better support for caching is often +mitigated by its lack of thread safety. The same is true of requests in +terms of caching. + + +Quickstart +========== + +.. code-block:: python + + import requests + + from cachecontrol import CacheControl + + + sess = requests.session() + cached_sess = CacheControl(sess) + + response = cached_sess.get('http://google.com') + +If the URL contains any caching based headers, it will cache the +result in a simple dictionary. + +For more info, check out the docs_ + +.. _docs: http://cachecontrol.readthedocs.org/en/latest/ +.. _httplib2: https://github.com/jcgregorio/httplib2 +.. _requests: http://docs.python-requests.org/ + + diff --git a/cres/venv/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/RECORD b/cres/venv/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/RECORD new file mode 100644 index 000000000..4e968ad6f --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/RECORD @@ -0,0 +1,37 @@ +cachecontrol/__init__.py,sha256=pJtAaUxOsMPnytI1A3juAJkXYDr8krdSnsg4Yg3OBEg,302 +cachecontrol/_cmd.py,sha256=88j4P3JlJGqg6xAXR4btN9fYruXUH4CE-M93Sie5IB8,1242 +cachecontrol/adapter.py,sha256=ctnbSXDOj0V0NaxJP2jFauOYRDHaNYMP9QCE8kB4kfk,4870 +cachecontrol/cache.py,sha256=1fc4wJP8HYt1ycnJXeEw5pCpeBL2Cqxx6g9Fb0AYDWQ,805 +cachecontrol/compat.py,sha256=Fn_aYzqNbN0bK9gUn8SQUzMLxQ_ruGnsEMvryYDFh3o,647 +cachecontrol/controller.py,sha256=fpLmIvxce2mKVFmtDFiiyydqU_pPbCucYLC9qP-LqvY,14137 +cachecontrol/filewrapper.py,sha256=vACKO8Llzu_ZWyjV1Fxn1MA4TGU60N5N3GSrAFdAY2Q,2533 +cachecontrol/heuristics.py,sha256=BFGHJ3yQcxvZizfo90LLZ04T_Z5XSCXvFotrp7Us0sc,4070 +cachecontrol/serialize.py,sha256=Jms7OS4GB2JFUzuMPlmQtuCDzcjjE-2ijrHpUXC2BV0,7062 +cachecontrol/wrapper.py,sha256=5LX0uJwkNQUtYSEw3aGmGu9WY8wGipd81mJ8lG0d0M4,690 +cachecontrol/caches/__init__.py,sha256=-gHNKYvaeD0kOk5M74eOrsSgIKUtC6i6GfbmugGweEo,86 +cachecontrol/caches/file_cache.py,sha256=nYVKsJtXh6gJXvdn1iWyrhxvkwpQrK-eKoMRzuiwkKk,4153 +cachecontrol/caches/redis_cache.py,sha256=yZP1PoUgAvxEZZrCVwImZ-5pFKU41v5HYJf1rfbXYmM,844 +CacheControl-0.12.6.dist-info/AUTHORS.txt,sha256=RtqU9KfonVGhI48DAA4-yTOBUhBtQTjFhaDzHoyh7uU,21518 +CacheControl-0.12.6.dist-info/LICENSE.txt,sha256=W6Ifuwlk-TatfRU2LR7W1JMcyMj5_y1NkRkOEJvnRDE,1090 +CacheControl-0.12.6.dist-info/METADATA,sha256=DzDqga-Bw7B7ylVrJanU_-imHV1od8Ok64qr5ugT-5A,2107 +CacheControl-0.12.6.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110 +CacheControl-0.12.6.dist-info/top_level.txt,sha256=vGYWzpbe3h6gkakV4f7iCK2x3KyK3oMkV5pe5v25-d4,13 +CacheControl-0.12.6.dist-info/RECORD,, +cachecontrol/__pycache__,, +cachecontrol/serialize.cpython-38.pyc,, +cachecontrol/compat.cpython-38.pyc,, +cachecontrol/caches/__pycache__,, +cachecontrol/heuristics.cpython-38.pyc,, +cachecontrol/caches/file_cache.cpython-38.pyc,, +CacheControl-0.12.6.dist-info/INSTALLER,, +cachecontrol/wrapper.cpython-38.pyc,, +cachecontrol/filewrapper.cpython-38.pyc,, +CacheControl-0.12.6.virtualenv,, +CacheControl-0.12.6.dist-info/__pycache__,, +cachecontrol/cache.cpython-38.pyc,, +cachecontrol/controller.cpython-38.pyc,, +cachecontrol/adapter.cpython-38.pyc,, +cachecontrol/_cmd.cpython-38.pyc,, +cachecontrol/caches/__init__.cpython-38.pyc,, +cachecontrol/__init__.cpython-38.pyc,, +cachecontrol/caches/redis_cache.cpython-38.pyc,, \ No newline at end of file diff --git a/cres/venv/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/WHEEL b/cres/venv/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/WHEEL new file mode 100644 index 000000000..ef99c6cf3 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.34.2) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/cres/venv/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/top_level.txt b/cres/venv/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/top_level.txt new file mode 100644 index 000000000..af37ac627 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/CacheControl-0.12.6.dist-info/top_level.txt @@ -0,0 +1 @@ +cachecontrol diff --git a/cres/venv/lib/python3.8/site-packages/CacheControl-0.12.6.virtualenv b/cres/venv/lib/python3.8/site-packages/CacheControl-0.12.6.virtualenv new file mode 100644 index 000000000..e69de29bb diff --git a/cres/venv/lib/python3.8/site-packages/PyYAML-5.3.1.dist-info/INSTALLER b/cres/venv/lib/python3.8/site-packages/PyYAML-5.3.1.dist-info/INSTALLER new file mode 100644 index 000000000..a1b589e38 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/PyYAML-5.3.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/cres/venv/lib/python3.8/site-packages/PyYAML-5.3.1.dist-info/LICENSE b/cres/venv/lib/python3.8/site-packages/PyYAML-5.3.1.dist-info/LICENSE new file mode 100644 index 000000000..3d82c281e --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/PyYAML-5.3.1.dist-info/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2017-2020 Ingy döt Net +Copyright (c) 2006-2016 Kirill Simonov + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/cres/venv/lib/python3.8/site-packages/PyYAML-5.3.1.dist-info/METADATA b/cres/venv/lib/python3.8/site-packages/PyYAML-5.3.1.dist-info/METADATA new file mode 100644 index 000000000..a70dd202d --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/PyYAML-5.3.1.dist-info/METADATA @@ -0,0 +1,41 @@ +Metadata-Version: 2.1 +Name: PyYAML +Version: 5.3.1 +Summary: YAML parser and emitter for Python +Home-page: https://github.com/yaml/pyyaml +Author: Kirill Simonov +Author-email: xi@resolvent.net +License: MIT +Download-URL: https://pypi.org/project/PyYAML/ +Platform: Any +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Cython +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.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Markup +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.* + +YAML is a data serialization format designed for human readability +and interaction with scripting languages. PyYAML is a YAML parser +and emitter for Python. + +PyYAML features a complete YAML 1.1 parser, Unicode support, pickle +support, capable extension API, and sensible error messages. PyYAML +supports standard YAML tags and provides Python-specific tags that +allow to represent an arbitrary Python object. + +PyYAML is applicable for a broad range of tasks from complex +configuration files to object serialization and persistence. + diff --git a/cres/venv/lib/python3.8/site-packages/PyYAML-5.3.1.dist-info/RECORD b/cres/venv/lib/python3.8/site-packages/PyYAML-5.3.1.dist-info/RECORD new file mode 100644 index 000000000..cc2f8675a --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/PyYAML-5.3.1.dist-info/RECORD @@ -0,0 +1,40 @@ +PyYAML-5.3.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +PyYAML-5.3.1.dist-info/LICENSE,sha256=xAESRJ8lS5dTBFklJIMT6ScO-jbSJrItgtTMbEPFfyk,1101 +PyYAML-5.3.1.dist-info/METADATA,sha256=xTsZFjd8T4M-5rC2M3BHgx_KTTpEPy5vFDIXrbzRXPQ,1758 +PyYAML-5.3.1.dist-info/RECORD,, +PyYAML-5.3.1.dist-info/WHEEL,sha256=TpFVeXF_cAlV118WSIPWtjqW7nPvzoOw-49FmS3fDKQ,103 +PyYAML-5.3.1.dist-info/top_level.txt,sha256=rpj0IVMTisAjh_1vG3Ccf9v5jpCQwAz6cD1IVU5ZdhQ,11 +yaml/__init__.py,sha256=XFUNbKTg4afAd0BETjGQ1mKQ97_g5jbE1C0WoKc74dc,13170 +yaml/__pycache__/__init__.cpython-38.pyc,, +yaml/__pycache__/composer.cpython-38.pyc,, +yaml/__pycache__/constructor.cpython-38.pyc,, +yaml/__pycache__/cyaml.cpython-38.pyc,, +yaml/__pycache__/dumper.cpython-38.pyc,, +yaml/__pycache__/emitter.cpython-38.pyc,, +yaml/__pycache__/error.cpython-38.pyc,, +yaml/__pycache__/events.cpython-38.pyc,, +yaml/__pycache__/loader.cpython-38.pyc,, +yaml/__pycache__/nodes.cpython-38.pyc,, +yaml/__pycache__/parser.cpython-38.pyc,, +yaml/__pycache__/reader.cpython-38.pyc,, +yaml/__pycache__/representer.cpython-38.pyc,, +yaml/__pycache__/resolver.cpython-38.pyc,, +yaml/__pycache__/scanner.cpython-38.pyc,, +yaml/__pycache__/serializer.cpython-38.pyc,, +yaml/__pycache__/tokens.cpython-38.pyc,, +yaml/composer.py,sha256=_Ko30Wr6eDWUeUpauUGT3Lcg9QPBnOPVlTnIMRGJ9FM,4883 +yaml/constructor.py,sha256=O3Uaf0_J_5GQBoeI9ZNhpJAhtdagr_X2HzDgGbZOMnw,28627 +yaml/cyaml.py,sha256=LiMkvchNonfoy1F6ec9L2BiUz3r0bwF4hympASJX1Ic,3846 +yaml/dumper.py,sha256=PLctZlYwZLp7XmeUdwRuv4nYOZ2UBnDIUy8-lKfLF-o,2837 +yaml/emitter.py,sha256=jghtaU7eFwg31bG0B7RZea_29Adi9CKmXq_QjgQpCkQ,43006 +yaml/error.py,sha256=Ah9z-toHJUbE9j-M8YpxgSRM5CgLCcwVzJgLLRF2Fxo,2533 +yaml/events.py,sha256=50_TksgQiE4up-lKo_V-nBy-tAIxkIPQxY5qDhKCeHw,2445 +yaml/loader.py,sha256=UVa-zIqmkFSCIYq_PgSGm4NSJttHY2Rf_zQ4_b1fHN0,2061 +yaml/nodes.py,sha256=gPKNj8pKCdh2d4gr3gIYINnPOaOxGhJAUiYhGRnPE84,1440 +yaml/parser.py,sha256=ilWp5vvgoHFGzvOZDItFoGjD6D42nhlZrZyjAwa0oJo,25495 +yaml/reader.py,sha256=0dmzirOiDG4Xo41RnuQS7K9rkY3xjHiVasfDMNTqCNw,6794 +yaml/representer.py,sha256=82UM3ZxUQKqsKAF4ltWOxCS6jGPIFtXpGs7mvqyv4Xs,14184 +yaml/resolver.py,sha256=DJCjpQr8YQCEYYjKEYqTl0GrsZil2H4aFOI9b0Oe-U4,8970 +yaml/scanner.py,sha256=KeQIKGNlSyPE8QDwionHxy9CgbqE5teJEz05FR9-nAg,51277 +yaml/serializer.py,sha256=ChuFgmhU01hj4xgI8GaKv6vfM2Bujwa9i7d2FAHj7cA,4165 +yaml/tokens.py,sha256=lTQIzSVw8Mg9wv459-TjiOQe6wVziqaRlqX2_89rp54,2573 diff --git a/cres/venv/lib/python3.8/site-packages/PyYAML-5.3.1.dist-info/WHEEL b/cres/venv/lib/python3.8/site-packages/PyYAML-5.3.1.dist-info/WHEEL new file mode 100644 index 000000000..d193dea98 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/PyYAML-5.3.1.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.34.2) +Root-Is-Purelib: false +Tag: cp38-cp38-linux_x86_64 + diff --git a/cres/venv/lib/python3.8/site-packages/PyYAML-5.3.1.dist-info/top_level.txt b/cres/venv/lib/python3.8/site-packages/PyYAML-5.3.1.dist-info/top_level.txt new file mode 100644 index 000000000..e6475e911 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/PyYAML-5.3.1.dist-info/top_level.txt @@ -0,0 +1,2 @@ +_yaml +yaml diff --git a/cres/venv/lib/python3.8/site-packages/__pycache__/_virtualenv.cpython-38.pyc b/cres/venv/lib/python3.8/site-packages/__pycache__/_virtualenv.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..00c077ef25c72704b08091f462b29d89713bef37 GIT binary patch literal 3998 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 literal 0 HcmV?d00001 diff --git a/cres/venv/lib/python3.8/site-packages/__pycache__/distro.cpython-38.pyc b/cres/venv/lib/python3.8/site-packages/__pycache__/distro.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e276a5bf626c465a87f9c0ad3e0fd75d5220efbf GIT binary patch literal 36590 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 literal 0 HcmV?d00001 diff --git a/cres/venv/lib/python3.8/site-packages/_virtualenv.pth b/cres/venv/lib/python3.8/site-packages/_virtualenv.pth new file mode 100644 index 000000000..1c3ff9986 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/_virtualenv.pth @@ -0,0 +1 @@ +import _virtualenv \ No newline at end of file diff --git a/cres/venv/lib/python3.8/site-packages/_virtualenv.py b/cres/venv/lib/python3.8/site-packages/_virtualenv.py new file mode 100644 index 000000000..b399da4cc --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/_virtualenv.py @@ -0,0 +1,115 @@ +"""Patches that are applied at runtime to the virtual environment""" +# -*- coding: utf-8 -*- + +import os +import sys + +VIRTUALENV_PATCH_FILE = os.path.join(__file__) + + +def patch_dist(dist): + """ + Distutils allows user to configure some arguments via a configuration file: + https://docs.python.org/3/install/index.html#distutils-configuration-files + + Some of this arguments though don't make sense in context of the virtual environment files, let's fix them up. + """ + # we cannot allow some install config as that would get packages installed outside of the virtual environment + old_parse_config_files = dist.Distribution.parse_config_files + + def parse_config_files(self, *args, **kwargs): + result = old_parse_config_files(self, *args, **kwargs) + install = self.get_option_dict("install") + + if "prefix" in install: # the prefix governs where to install the libraries + install["prefix"] = VIRTUALENV_PATCH_FILE, os.path.abspath(sys.prefix) + for base in ("purelib", "platlib", "headers", "scripts", "data"): + key = "install_{}".format(base) + if key in install: # do not allow global configs to hijack venv paths + install.pop(key, None) + return result + + dist.Distribution.parse_config_files = parse_config_files + + +# Import hook that patches some modules to ignore configuration values that break package installation in case +# of virtual environments. +_DISTUTILS_PATCH = "distutils.dist", "setuptools.dist" +if sys.version_info > (3, 4): + # https://docs.python.org/3/library/importlib.html#setting-up-an-importer + from importlib.abc import MetaPathFinder + from importlib.util import find_spec + from threading import Lock + from functools import partial + + class _Finder(MetaPathFinder): + """A meta path finder that allows patching the imported distutils modules""" + + fullname = None + lock = Lock() + + def find_spec(self, fullname, path, target=None): + if fullname in _DISTUTILS_PATCH and self.fullname is None: + with self.lock: + self.fullname = fullname + try: + spec = find_spec(fullname, path) + if spec is not None: + # https://www.python.org/dev/peps/pep-0451/#how-loading-will-work + is_new_api = hasattr(spec.loader, "exec_module") + func_name = "exec_module" if is_new_api else "load_module" + old = getattr(spec.loader, func_name) + func = self.exec_module if is_new_api else self.load_module + if old is not func: + try: + setattr(spec.loader, func_name, partial(func, old)) + except AttributeError: + pass # C-Extension loaders are r/o such as zipimporter with +Aakanksha Agrawal <11389424+rasponic@users.noreply.github.com> +Abhinav Sagar <40603139+abhinavsagar@users.noreply.github.com> +ABHYUDAY PRATAP SINGH +abs51295 +AceGentile +Adam Chainz +Adam Tse +Adam Tse +Adam Wentz +admin +Adrien Morison +ahayrapetyan +Ahilya +AinsworthK +Akash Srivastava +Alan Yee +Albert Tugushev +Albert-Guan +albertg +Aleks Bunin +Alethea Flowers +Alex Gaynor +Alex Grönholm +Alex Loosley +Alex Morega +Alex Stachowiak +Alexander Shtyrov +Alexandre Conrad +Alexey Popravka +Alexey Popravka +Alli +Ami Fischman +Ananya Maiti +Anatoly Techtonik +Anders Kaseorg +Andreas Lutro +Andrei Geacar +Andrew Gaul +Andrey Bulgakov +Andrés Delfino <34587441+andresdelfino@users.noreply.github.com> +Andrés Delfino +Andy Freeland +Andy Freeland +Andy Kluger +Ani Hayrapetyan +Aniruddha Basak +Anish Tambe +Anrs Hu +Anthony Sottile +Antoine Musso +Anton Ovchinnikov +Anton Patrushev +Antonio Alvarado Hernandez +Antony Lee +Antti Kaihola +Anubhav Patel +Anuj Godase +AQNOUCH Mohammed +AraHaan +Arindam Choudhury +Armin Ronacher +Artem +Ashley Manton +Ashwin Ramaswami +atse +Atsushi Odagiri +Avner Cohen +Baptiste Mispelon +Barney Gale +barneygale +Bartek Ogryczak +Bastian Venthur +Ben Darnell +Ben Hoyt +Ben Rosser +Bence Nagy +Benjamin Peterson +Benjamin VanEvery +Benoit Pierre +Berker Peksag +Bernardo B. Marques +Bernhard M. Wiedemann +Bertil Hatt +Bogdan Opanchuk +BorisZZZ +Brad Erickson +Bradley Ayers +Brandon L. Reiss +Brandt Bucher +Brett Randall +Brian Cristante <33549821+brcrista@users.noreply.github.com> +Brian Cristante +Brian Rosner +BrownTruck +Bruno Oliveira +Bruno Renié +Bstrdsmkr +Buck Golemon +burrows +Bussonnier Matthias +c22 +Caleb Martinez +Calvin Smith +Carl Meyer +Carlos Liam +Carol Willing +Carter Thayer +Cass +Chandrasekhar Atina +Chih-Hsuan Yen +Chih-Hsuan Yen +Chris Brinker +Chris Hunt +Chris Jerdonek +Chris McDonough +Chris Wolfe +Christian Heimes +Christian Oudard +Christopher Hunt +Christopher Snyder +Clark Boylan +Clay McClure +Cody +Cody Soyland +Colin Watson +Connor Osborn +Cooper Lees +Cooper Ry Lees +Cory Benfield +Cory Wright +Craig Kerstiens +Cristian Sorinel +Curtis Doty +cytolentino +Damian Quiroga +Dan Black +Dan Savilonis +Dan Sully +daniel +Daniel Collins +Daniel Hahler +Daniel Holth +Daniel Jost +Daniel Shaulov +Daniele Esposti +Daniele Procida +Danny Hermes +Dav Clark +Dave Abrahams +Dave Jones +David Aguilar +David Black +David Bordeynik +David Bordeynik +David Caro +David Evans +David Linke +David Pursehouse +David Tucker +David Wales +Davidovich +derwolfe +Desetude +Diego Caraballo +DiegoCaraballo +Dmitry Gladkov +Domen Kožar +Donald Stufft +Dongweiming +Douglas Thor +DrFeathers +Dustin Ingram +Dwayne Bailey +Ed Morley <501702+edmorley@users.noreply.github.com> +Ed Morley +Eitan Adler +ekristina +elainechan +Eli Schwartz +Eli Schwartz +Emil Burzo +Emil Styrke +Endoh Takanao +enoch +Erdinc Mutlu +Eric Gillingham +Eric Hanchrow +Eric Hopper +Erik M. Bray +Erik Rose +Ernest W Durbin III +Ernest W. Durbin III +Erwin Janssen +Eugene Vereshchagin +everdimension +Felix Yan +fiber-space +Filip Kokosiński +Florian Briand +Florian Rathgeber +Francesco +Francesco Montesano +Frost Ming +Gabriel Curio +Gabriel de Perthuis +Garry Polley +gdanielson +Geoffrey Lehée +Geoffrey Sneddon +George Song +Georgi Valkov +Giftlin Rajaiah +gizmoguy1 +gkdoc <40815324+gkdoc@users.noreply.github.com> +Gopinath M <31352222+mgopi1990@users.noreply.github.com> +GOTO Hayato <3532528+gh640@users.noreply.github.com> +gpiks +Guilherme Espada +Guy Rozendorn +gzpan123 +Hanjun Kim +Hari Charan +Harsh Vardhan +Herbert Pfennig +Hsiaoming Yang +Hugo +Hugo Lopes Tavares +Hugo van Kemenade +hugovk +Hynek Schlawack +Ian Bicking +Ian Cordasco +Ian Lee +Ian Stapleton Cordasco +Ian Wienand +Ian Wienand +Igor Kuzmitshov +Igor Sobreira +Ilya Baryshev +INADA Naoki +Ionel Cristian Mărieș +Ionel Maries Cristian +Ivan Pozdeev +Jacob Kim +jakirkham +Jakub Stasiak +Jakub Vysoky +Jakub Wilk +James Cleveland +James Cleveland +James Firth +James Polley +Jan Pokorný +Jannis Leidel +jarondl +Jason R. Coombs +Jay Graves +Jean-Christophe Fillion-Robin +Jeff Barber +Jeff Dairiki +Jelmer Vernooij +jenix21 +Jeremy Stanley +Jeremy Zafran +Jiashuo Li +Jim Garrison +Jivan Amara +John Paton +John-Scott Atlakson +johnthagen +johnthagen +Jon Banafato +Jon Dufresne +Jon Parise +Jonas Nockert +Jonathan Herbert +Joost Molenaar +Jorge Niedbalski +Joseph Long +Josh Bronson +Josh Hansen +Josh Schneier +Juanjo Bazán +Julian Berman +Julian Gethmann +Julien Demoor +jwg4 +Jyrki Pulliainen +Kai Chen +Kamal Bin Mustafa +kaustav haldar +keanemind +Keith Maxwell +Kelsey Hightower +Kenneth Belitzky +Kenneth Reitz +Kenneth Reitz +Kevin Burke +Kevin Carter +Kevin Frommelt +Kevin R Patterson +Kexuan Sun +Kit Randel +kpinc +Krishna Oza +Kumar McMillan +Kyle Persohn +lakshmanaram +Laszlo Kiss-Kollar +Laurent Bristiel +Laurie Opperman +Leon Sasson +Lev Givon +Lincoln de Sousa +Lipis +Loren Carvalho +Lucas Cimon +Ludovic Gasc +Luke Macken +Luo Jiebin +luojiebin +luz.paz +László Kiss Kollár +László Kiss Kollár +Marc Abramowitz +Marc Tamlyn +Marcus Smith +Mariatta +Mark Kohler +Mark Williams +Mark Williams +Markus Hametner +Masaki +Masklinn +Matej Stuchlik +Mathew Jennings +Mathieu Bridon +Matt Good +Matt Maker +Matt Robenolt +matthew +Matthew Einhorn +Matthew Gilliard +Matthew Iversen +Matthew Trumbell +Matthew Willson +Matthias Bussonnier +mattip +Maxim Kurnikov +Maxime Rouyrre +mayeut +mbaluna <44498973+mbaluna@users.noreply.github.com> +mdebi <17590103+mdebi@users.noreply.github.com> +memoselyk +Michael +Michael Aquilina +Michael E. Karpeles +Michael Klich +Michael Williamson +michaelpacer +Mickaël Schoentgen +Miguel Araujo Perez +Mihir Singh +Mike +Mike Hendricks +Min RK +MinRK +Miro Hrončok +Monica Baluna +montefra +Monty Taylor +Nate Coraor +Nathaniel J. Smith +Nehal J Wani +Neil Botelho +Nick Coghlan +Nick Stenning +Nick Timkovich +Nicolas Bock +Nikhil Benesch +Nitesh Sharma +Nowell Strite +NtaleGrey +nvdv +Ofekmeister +ofrinevo +Oliver Jeeves +Oliver Tonnhofer +Olivier Girardot +Olivier Grisel +Ollie Rutherfurd +OMOTO Kenji +Omry Yadan +Oren Held +Oscar Benjamin +Oz N Tiram +Pachwenko <32424503+Pachwenko@users.noreply.github.com> +Patrick Dubroy +Patrick Jenkins +Patrick Lawson +patricktokeeffe +Patrik Kopkan +Paul Kehrer +Paul Moore +Paul Nasrat +Paul Oswald +Paul van der Linden +Paulus Schoutsen +Pavithra Eswaramoorthy <33131404+QueenCoffee@users.noreply.github.com> +Pawel Jasinski +Pekka Klärck +Peter Lisák +Peter Waller +petr-tik +Phaneendra Chiruvella +Phil Freo +Phil Pennock +Phil Whelan +Philip Jägenstedt +Philip Molloy +Philippe Ombredanne +Pi Delport +Pierre-Yves Rofes +pip +Prabakaran Kumaresshan +Prabhjyotsing Surjit Singh Sodhi +Prabhu Marappan +Pradyun Gedam +Pratik Mallya +Preet Thakkar +Preston Holmes +Przemek Wrzos +Pulkit Goyal <7895pulkit@gmail.com> +Qiangning Hong +Quentin Pradet +R. David Murray +Rafael Caricio +Ralf Schmitt +Razzi Abuissa +rdb +Remi Rampin +Remi Rampin +Rene Dudfield +Riccardo Magliocchetti +Richard Jones +RobberPhex +Robert Collins +Robert McGibbon +Robert T. McGibbon +robin elisha robinson +Roey Berman +Rohan Jain +Rohan Jain +Rohan Jain +Roman Bogorodskiy +Romuald Brunet +Ronny Pfannschmidt +Rory McCann +Ross Brattain +Roy Wellington Ⅳ +Roy Wellington Ⅳ +Ryan Wooden +ryneeverett +Sachi King +Salvatore Rinchiera +Savio Jomton +schlamar +Scott Kitterman +Sean +seanj +Sebastian Jordan +Sebastian Schaetz +Segev Finer +SeongSoo Cho +Sergey Vasilyev +Seth Woodworth +Shlomi Fish +Shovan Maity +Simeon Visser +Simon Cross +Simon Pichugin +sinoroc +Sorin Sbarnea +Stavros Korokithakis +Stefan Scherfke +Stephan Erb +stepshal +Steve (Gadget) Barnes +Steve Barnes +Steve Dower +Steve Kowalik +Steven Myint +stonebig +Stéphane Bidoul (ACSONE) +Stéphane Bidoul +Stéphane Klein +Sumana Harihareswara +Sviatoslav Sydorenko +Sviatoslav Sydorenko +Swat009 +Takayuki SHIMIZUKAWA +tbeswick +Thijs Triemstra +Thomas Fenzl +Thomas Grainger +Thomas Guettler +Thomas Johansson +Thomas Kluyver +Thomas Smith +Tim D. Smith +Tim Gates +Tim Harder +Tim Heap +tim smith +tinruufu +Tom Forbes +Tom Freudenheim +Tom V +Tomas Orsava +Tomer Chachamu +Tony Beswick +Tony Zhaocheng Tan +TonyBeswick +toonarmycaptain +Toshio Kuratomi +Travis Swicegood +Tzu-ping Chung +Valentin Haenel +Victor Stinner +victorvpaulo +Viktor Szépe +Ville Skyttä +Vinay Sajip +Vincent Philippon +Vinicyus Macedo <7549205+vinicyusmacedo@users.noreply.github.com> +Vitaly Babiy +Vladimir Rutsky +W. Trevor King +Wil Tan +Wilfred Hughes +William ML Leslie +William T Olson +Wilson Mo +wim glenn +Wolfgang Maier +Xavier Fernandez +Xavier Fernandez +xoviat +xtreak +YAMAMOTO Takashi +Yen Chi Hsuan +Yeray Diaz Diaz +Yoval P +Yu Jian +Yuan Jing Vincent Yan +Zearin +Zearin +Zhiping Deng +Zvezdan Petkovic +Łukasz Langa +Семён Марьясин diff --git a/cres/venv/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/INSTALLER b/cres/venv/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/INSTALLER new file mode 100644 index 000000000..a1b589e38 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/cres/venv/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/LICENSE.txt b/cres/venv/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/LICENSE.txt new file mode 100644 index 000000000..737fec5c5 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/LICENSE.txt @@ -0,0 +1,20 @@ +Copyright (c) 2008-2019 The pip developers (see AUTHORS.txt file) + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/cres/venv/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/METADATA b/cres/venv/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/METADATA new file mode 100644 index 000000000..56a3d6ea2 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/METADATA @@ -0,0 +1,256 @@ +Metadata-Version: 2.1 +Name: appdirs +Version: 1.4.3 +Summary: A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir". +Home-page: http://github.com/ActiveState/appdirs +Author: Trent Mick +Author-email: trentm@gmail.com +Maintainer: Trent Mick; Sridhar Ratnakumar; Jeff Rouse +Maintainer-email: trentm@gmail.com; github@srid.name; jr@its.to +License: MIT +Keywords: application directory log cache user +Platform: UNKNOWN +Classifier: Development Status :: 4 - Beta +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.2 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Topic :: Software Development :: Libraries :: Python Modules + + +.. image:: https://secure.travis-ci.org/ActiveState/appdirs.png + :target: http://travis-ci.org/ActiveState/appdirs + +the problem +=========== + +What directory should your app use for storing user data? If running on Mac OS X, you +should use:: + + ~/Library/Application Support/ + +If on Windows (at least English Win XP) that should be:: + + C:\Documents and Settings\\Application Data\Local Settings\\ + +or possibly:: + + C:\Documents and Settings\\Application Data\\ + +for `roaming profiles `_ but that is another story. + +On Linux (and other Unices) the dir, according to the `XDG +spec `_, is:: + + ~/.local/share/ + + +``appdirs`` to the rescue +========================= + +This kind of thing is what the ``appdirs`` module is for. ``appdirs`` will +help you choose an appropriate: + +- user data dir (``user_data_dir``) +- user config dir (``user_config_dir``) +- user cache dir (``user_cache_dir``) +- site data dir (``site_data_dir``) +- site config dir (``site_config_dir``) +- user log dir (``user_log_dir``) + +and also: + +- is a single module so other Python packages can include their own private copy +- is slightly opinionated on the directory names used. Look for "OPINION" in + documentation and code for when an opinion is being applied. + + +some example output +=================== + +On Mac OS X:: + + >>> from appdirs import * + >>> appname = "SuperApp" + >>> appauthor = "Acme" + >>> user_data_dir(appname, appauthor) + '/Users/trentm/Library/Application Support/SuperApp' + >>> site_data_dir(appname, appauthor) + '/Library/Application Support/SuperApp' + >>> user_cache_dir(appname, appauthor) + '/Users/trentm/Library/Caches/SuperApp' + >>> user_log_dir(appname, appauthor) + '/Users/trentm/Library/Logs/SuperApp' + +On Windows 7:: + + >>> from appdirs import * + >>> appname = "SuperApp" + >>> appauthor = "Acme" + >>> user_data_dir(appname, appauthor) + 'C:\\Users\\trentm\\AppData\\Local\\Acme\\SuperApp' + >>> user_data_dir(appname, appauthor, roaming=True) + 'C:\\Users\\trentm\\AppData\\Roaming\\Acme\\SuperApp' + >>> user_cache_dir(appname, appauthor) + 'C:\\Users\\trentm\\AppData\\Local\\Acme\\SuperApp\\Cache' + >>> user_log_dir(appname, appauthor) + 'C:\\Users\\trentm\\AppData\\Local\\Acme\\SuperApp\\Logs' + +On Linux:: + + >>> from appdirs import * + >>> appname = "SuperApp" + >>> appauthor = "Acme" + >>> user_data_dir(appname, appauthor) + '/home/trentm/.local/share/SuperApp + >>> site_data_dir(appname, appauthor) + '/usr/local/share/SuperApp' + >>> site_data_dir(appname, appauthor, multipath=True) + '/usr/local/share/SuperApp:/usr/share/SuperApp' + >>> user_cache_dir(appname, appauthor) + '/home/trentm/.cache/SuperApp' + >>> user_log_dir(appname, appauthor) + '/home/trentm/.cache/SuperApp/log' + >>> user_config_dir(appname) + '/home/trentm/.config/SuperApp' + >>> site_config_dir(appname) + '/etc/xdg/SuperApp' + >>> os.environ['XDG_CONFIG_DIRS'] = '/etc:/usr/local/etc' + >>> site_config_dir(appname, multipath=True) + '/etc/SuperApp:/usr/local/etc/SuperApp' + + +``AppDirs`` for convenience +=========================== + +:: + + >>> from appdirs import AppDirs + >>> dirs = AppDirs("SuperApp", "Acme") + >>> dirs.user_data_dir + '/Users/trentm/Library/Application Support/SuperApp' + >>> dirs.site_data_dir + '/Library/Application Support/SuperApp' + >>> dirs.user_cache_dir + '/Users/trentm/Library/Caches/SuperApp' + >>> dirs.user_log_dir + '/Users/trentm/Library/Logs/SuperApp' + + + +Per-version isolation +===================== + +If you have multiple versions of your app in use that you want to be +able to run side-by-side, then you may want version-isolation for these +dirs:: + + >>> from appdirs import AppDirs + >>> dirs = AppDirs("SuperApp", "Acme", version="1.0") + >>> dirs.user_data_dir + '/Users/trentm/Library/Application Support/SuperApp/1.0' + >>> dirs.site_data_dir + '/Library/Application Support/SuperApp/1.0' + >>> dirs.user_cache_dir + '/Users/trentm/Library/Caches/SuperApp/1.0' + >>> dirs.user_log_dir + '/Users/trentm/Library/Logs/SuperApp/1.0' + + + +appdirs Changelog +================= + +appdirs 1.4.3 +------------- +- [PR #76] Python 3.6 invalid escape sequence deprecation fixes +- Fix for Python 3.6 support + +appdirs 1.4.2 +------------- +- [PR #84] Allow installing without setuptools +- [PR #86] Fix string delimiters in setup.py description +- Add Python 3.6 support + +appdirs 1.4.1 +------------- +- [issue #38] Fix _winreg import on Windows Py3 +- [issue #55] Make appname optional + +appdirs 1.4.0 +------------- +- [PR #42] AppAuthor is now optional on Windows +- [issue 41] Support Jython on Windows, Mac, and Unix-like platforms. Windows + support requires `JNA `_. +- [PR #44] Fix incorrect behaviour of the site_config_dir method + +appdirs 1.3.0 +------------- +- [Unix, issue 16] Conform to XDG standard, instead of breaking it for + everybody +- [Unix] Removes gratuitous case mangling of the case, since \*nix-es are + usually case sensitive, so mangling is not wise +- [Unix] Fixes the utterly wrong behaviour in ``site_data_dir``, return result + based on XDG_DATA_DIRS and make room for respecting the standard which + specifies XDG_DATA_DIRS is a multiple-value variable +- [Issue 6] Add ``*_config_dir`` which are distinct on nix-es, according to + XDG specs; on Windows and Mac return the corresponding ``*_data_dir`` + +appdirs 1.2.0 +------------- + +- [Unix] Put ``user_log_dir`` under the *cache* dir on Unix. Seems to be more + typical. +- [issue 9] Make ``unicode`` work on py3k. + +appdirs 1.1.0 +------------- + +- [issue 4] Add ``AppDirs.user_log_dir``. +- [Unix, issue 2, issue 7] appdirs now conforms to `XDG base directory spec + `_. +- [Mac, issue 5] Fix ``site_data_dir()`` on Mac. +- [Mac] Drop use of 'Carbon' module in favour of hardcoded paths; supports + Python3 now. +- [Windows] Append "Cache" to ``user_cache_dir`` on Windows by default. Use + ``opinion=False`` option to disable this. +- Add ``appdirs.AppDirs`` convenience class. Usage: + + >>> dirs = AppDirs("SuperApp", "Acme", version="1.0") + >>> dirs.user_data_dir + '/Users/trentm/Library/Application Support/SuperApp/1.0' + +- [Windows] Cherry-pick Komodo's change to downgrade paths to the Windows short + paths if there are high bit chars. +- [Linux] Change default ``user_cache_dir()`` on Linux to be singular, e.g. + "~/.superapp/cache". +- [Windows] Add ``roaming`` option to ``user_data_dir()`` (for use on Windows only) + and change the default ``user_data_dir`` behaviour to use a *non*-roaming + profile dir (``CSIDL_LOCAL_APPDATA`` instead of ``CSIDL_APPDATA``). Why? Because + a large roaming profile can cause login speed issues. The "only syncs on + logout" behaviour can cause surprises in appdata info. + + +appdirs 1.0.1 (never released) +------------------------------ + +Started this changelog 27 July 2010. Before that this module originated in the +`Komodo `_ product as ``applib.py`` and then +as `applib/location.py +`_ (used by +`PyPM `_ in `ActivePython +`_). This is basically a fork of +applib.py 1.0.1 and applib/location.py 1.0.1. + + + diff --git a/cres/venv/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/RECORD b/cres/venv/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/RECORD new file mode 100644 index 000000000..3571f6243 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/RECORD @@ -0,0 +1,11 @@ +appdirs.py,sha256=MievUEuv3l_mQISH5SF0shDk_BNhHHzYiAPrT3ITN4I,24701 +appdirs-1.4.3.dist-info/AUTHORS.txt,sha256=RtqU9KfonVGhI48DAA4-yTOBUhBtQTjFhaDzHoyh7uU,21518 +appdirs-1.4.3.dist-info/LICENSE.txt,sha256=W6Ifuwlk-TatfRU2LR7W1JMcyMj5_y1NkRkOEJvnRDE,1090 +appdirs-1.4.3.dist-info/METADATA,sha256=CYv_MUT9ndNhXtkeyXnWjTM6jW_z6fsu8wqD6Yxfn0k,8831 +appdirs-1.4.3.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110 +appdirs-1.4.3.dist-info/top_level.txt,sha256=nKncE8CUqZERJ6VuQWL4_bkunSPDNfn7KZqb4Tr5YEM,8 +appdirs-1.4.3.dist-info/RECORD,, +appdirs-1.4.3.virtualenv,, +appdirs-1.4.3.dist-info/__pycache__,, +appdirs.cpython-38.pyc,, +appdirs-1.4.3.dist-info/INSTALLER,, \ No newline at end of file diff --git a/cres/venv/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/WHEEL b/cres/venv/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/WHEEL new file mode 100644 index 000000000..ef99c6cf3 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.34.2) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/cres/venv/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/top_level.txt b/cres/venv/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/top_level.txt new file mode 100644 index 000000000..d64bc321a --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/appdirs-1.4.3.dist-info/top_level.txt @@ -0,0 +1 @@ +appdirs diff --git a/cres/venv/lib/python3.8/site-packages/appdirs-1.4.3.virtualenv b/cres/venv/lib/python3.8/site-packages/appdirs-1.4.3.virtualenv new file mode 100644 index 000000000..e69de29bb diff --git a/cres/venv/lib/python3.8/site-packages/appdirs.py b/cres/venv/lib/python3.8/site-packages/appdirs.py new file mode 100644 index 000000000..ae67001af --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/appdirs.py @@ -0,0 +1,608 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright (c) 2005-2010 ActiveState Software Inc. +# Copyright (c) 2013 Eddy Petrișor + +"""Utilities for determining application-specific dirs. + +See for details and usage. +""" +# Dev Notes: +# - MSDN on where to store app data files: +# http://support.microsoft.com/default.aspx?scid=kb;en-us;310294#XSLTH3194121123120121120120 +# - Mac OS X: http://developer.apple.com/documentation/MacOSX/Conceptual/BPFileSystem/index.html +# - XDG spec for Un*x: http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html + +__version_info__ = (1, 4, 3) +__version__ = '.'.join(map(str, __version_info__)) + + +import sys +import os + +PY3 = sys.version_info[0] == 3 + +if PY3: + unicode = str + +if sys.platform.startswith('java'): + import platform + os_name = platform.java_ver()[3][0] + if os_name.startswith('Windows'): # "Windows XP", "Windows 7", etc. + system = 'win32' + elif os_name.startswith('Mac'): # "Mac OS X", etc. + system = 'darwin' + else: # "Linux", "SunOS", "FreeBSD", etc. + # Setting this to "linux2" is not ideal, but only Windows or Mac + # are actually checked for and the rest of the module expects + # *sys.platform* style strings. + system = 'linux2' +else: + system = sys.platform + + + +def user_data_dir(appname=None, appauthor=None, version=None, roaming=False): + r"""Return full path to the user-specific data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be ".". + Only applied when appname is present. + "roaming" (boolean, default False) can be set True to use the Windows + roaming appdata directory. That means that for users on a Windows + network setup for roaming profiles, this user data will be + sync'd on login. See + + for a discussion of issues. + + Typical user data directories are: + Mac OS X: ~/Library/Application Support/ + Unix: ~/.local/share/ # or in $XDG_DATA_HOME, if defined + Win XP (not roaming): C:\Documents and Settings\\Application Data\\ + Win XP (roaming): C:\Documents and Settings\\Local Settings\Application Data\\ + Win 7 (not roaming): C:\Users\\AppData\Local\\ + Win 7 (roaming): C:\Users\\AppData\Roaming\\ + + For Unix, we follow the XDG spec and support $XDG_DATA_HOME. + That means, by default "~/.local/share/". + """ + if system == "win32": + if appauthor is None: + appauthor = appname + const = roaming and "CSIDL_APPDATA" or "CSIDL_LOCAL_APPDATA" + path = os.path.normpath(_get_win_folder(const)) + if appname: + if appauthor is not False: + path = os.path.join(path, appauthor, appname) + else: + path = os.path.join(path, appname) + elif system == 'darwin': + path = os.path.expanduser('~/Library/Application Support/') + if appname: + path = os.path.join(path, appname) + else: + path = os.getenv('XDG_DATA_HOME', os.path.expanduser("~/.local/share")) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def site_data_dir(appname=None, appauthor=None, version=None, multipath=False): + r"""Return full path to the user-shared data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be ".". + Only applied when appname is present. + "multipath" is an optional parameter only applicable to *nix + which indicates that the entire list of data dirs should be + returned. By default, the first item from XDG_DATA_DIRS is + returned, or '/usr/local/share/', + if XDG_DATA_DIRS is not set + + Typical site data directories are: + Mac OS X: /Library/Application Support/ + Unix: /usr/local/share/ or /usr/share/ + Win XP: C:\Documents and Settings\All Users\Application Data\\ + Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) + Win 7: C:\ProgramData\\ # Hidden, but writeable on Win 7. + + For Unix, this is using the $XDG_DATA_DIRS[0] default. + + WARNING: Do not use this on Windows. See the Vista-Fail note above for why. + """ + if system == "win32": + if appauthor is None: + appauthor = appname + path = os.path.normpath(_get_win_folder("CSIDL_COMMON_APPDATA")) + if appname: + if appauthor is not False: + path = os.path.join(path, appauthor, appname) + else: + path = os.path.join(path, appname) + elif system == 'darwin': + path = os.path.expanduser('/Library/Application Support') + if appname: + path = os.path.join(path, appname) + else: + # XDG default for $XDG_DATA_DIRS + # only first, if multipath is False + path = os.getenv('XDG_DATA_DIRS', + os.pathsep.join(['/usr/local/share', '/usr/share'])) + pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)] + if appname: + if version: + appname = os.path.join(appname, version) + pathlist = [os.sep.join([x, appname]) for x in pathlist] + + if multipath: + path = os.pathsep.join(pathlist) + else: + path = pathlist[0] + return path + + if appname and version: + path = os.path.join(path, version) + return path + + +def user_config_dir(appname=None, appauthor=None, version=None, roaming=False): + r"""Return full path to the user-specific config dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be ".". + Only applied when appname is present. + "roaming" (boolean, default False) can be set True to use the Windows + roaming appdata directory. That means that for users on a Windows + network setup for roaming profiles, this user data will be + sync'd on login. See + + for a discussion of issues. + + Typical user config directories are: + Mac OS X: same as user_data_dir + Unix: ~/.config/ # or in $XDG_CONFIG_HOME, if defined + Win *: same as user_data_dir + + For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME. + That means, by default "~/.config/". + """ + if system in ["win32", "darwin"]: + path = user_data_dir(appname, appauthor, None, roaming) + else: + path = os.getenv('XDG_CONFIG_HOME', os.path.expanduser("~/.config")) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def site_config_dir(appname=None, appauthor=None, version=None, multipath=False): + r"""Return full path to the user-shared data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be ".". + Only applied when appname is present. + "multipath" is an optional parameter only applicable to *nix + which indicates that the entire list of config dirs should be + returned. By default, the first item from XDG_CONFIG_DIRS is + returned, or '/etc/xdg/', if XDG_CONFIG_DIRS is not set + + Typical site config directories are: + Mac OS X: same as site_data_dir + Unix: /etc/xdg/ or $XDG_CONFIG_DIRS[i]/ for each value in + $XDG_CONFIG_DIRS + Win *: same as site_data_dir + Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) + + For Unix, this is using the $XDG_CONFIG_DIRS[0] default, if multipath=False + + WARNING: Do not use this on Windows. See the Vista-Fail note above for why. + """ + if system in ["win32", "darwin"]: + path = site_data_dir(appname, appauthor) + if appname and version: + path = os.path.join(path, version) + else: + # XDG default for $XDG_CONFIG_DIRS + # only first, if multipath is False + path = os.getenv('XDG_CONFIG_DIRS', '/etc/xdg') + pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)] + if appname: + if version: + appname = os.path.join(appname, version) + pathlist = [os.sep.join([x, appname]) for x in pathlist] + + if multipath: + path = os.pathsep.join(pathlist) + else: + path = pathlist[0] + return path + + +def user_cache_dir(appname=None, appauthor=None, version=None, opinion=True): + r"""Return full path to the user-specific cache dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be ".". + Only applied when appname is present. + "opinion" (boolean) can be False to disable the appending of + "Cache" to the base app data dir for Windows. See + discussion below. + + Typical user cache directories are: + Mac OS X: ~/Library/Caches/ + Unix: ~/.cache/ (XDG default) + Win XP: C:\Documents and Settings\\Local Settings\Application Data\\\Cache + Vista: C:\Users\\AppData\Local\\\Cache + + On Windows the only suggestion in the MSDN docs is that local settings go in + the `CSIDL_LOCAL_APPDATA` directory. This is identical to the non-roaming + app data dir (the default returned by `user_data_dir` above). Apps typically + put cache data somewhere *under* the given dir here. Some examples: + ...\Mozilla\Firefox\Profiles\\Cache + ...\Acme\SuperApp\Cache\1.0 + OPINION: This function appends "Cache" to the `CSIDL_LOCAL_APPDATA` value. + This can be disabled with the `opinion=False` option. + """ + if system == "win32": + if appauthor is None: + appauthor = appname + path = os.path.normpath(_get_win_folder("CSIDL_LOCAL_APPDATA")) + if appname: + if appauthor is not False: + path = os.path.join(path, appauthor, appname) + else: + path = os.path.join(path, appname) + if opinion: + path = os.path.join(path, "Cache") + elif system == 'darwin': + path = os.path.expanduser('~/Library/Caches') + if appname: + path = os.path.join(path, appname) + else: + path = os.getenv('XDG_CACHE_HOME', os.path.expanduser('~/.cache')) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def user_state_dir(appname=None, appauthor=None, version=None, roaming=False): + r"""Return full path to the user-specific state dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be ".". + Only applied when appname is present. + "roaming" (boolean, default False) can be set True to use the Windows + roaming appdata directory. That means that for users on a Windows + network setup for roaming profiles, this user data will be + sync'd on login. See + + for a discussion of issues. + + Typical user state directories are: + Mac OS X: same as user_data_dir + Unix: ~/.local/state/ # or in $XDG_STATE_HOME, if defined + Win *: same as user_data_dir + + For Unix, we follow this Debian proposal + to extend the XDG spec and support $XDG_STATE_HOME. + + That means, by default "~/.local/state/". + """ + if system in ["win32", "darwin"]: + path = user_data_dir(appname, appauthor, None, roaming) + else: + path = os.getenv('XDG_STATE_HOME', os.path.expanduser("~/.local/state")) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def user_log_dir(appname=None, appauthor=None, version=None, opinion=True): + r"""Return full path to the user-specific log dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be ".". + Only applied when appname is present. + "opinion" (boolean) can be False to disable the appending of + "Logs" to the base app data dir for Windows, and "log" to the + base cache dir for Unix. See discussion below. + + Typical user log directories are: + Mac OS X: ~/Library/Logs/ + Unix: ~/.cache//log # or under $XDG_CACHE_HOME if defined + Win XP: C:\Documents and Settings\\Local Settings\Application Data\\\Logs + Vista: C:\Users\\AppData\Local\\\Logs + + On Windows the only suggestion in the MSDN docs is that local settings + go in the `CSIDL_LOCAL_APPDATA` directory. (Note: I'm interested in + examples of what some windows apps use for a logs dir.) + + OPINION: This function appends "Logs" to the `CSIDL_LOCAL_APPDATA` + value for Windows and appends "log" to the user cache dir for Unix. + This can be disabled with the `opinion=False` option. + """ + if system == "darwin": + path = os.path.join( + os.path.expanduser('~/Library/Logs'), + appname) + elif system == "win32": + path = user_data_dir(appname, appauthor, version) + version = False + if opinion: + path = os.path.join(path, "Logs") + else: + path = user_cache_dir(appname, appauthor, version) + version = False + if opinion: + path = os.path.join(path, "log") + if appname and version: + path = os.path.join(path, version) + return path + + +class AppDirs(object): + """Convenience wrapper for getting application dirs.""" + def __init__(self, appname=None, appauthor=None, version=None, + roaming=False, multipath=False): + self.appname = appname + self.appauthor = appauthor + self.version = version + self.roaming = roaming + self.multipath = multipath + + @property + def user_data_dir(self): + return user_data_dir(self.appname, self.appauthor, + version=self.version, roaming=self.roaming) + + @property + def site_data_dir(self): + return site_data_dir(self.appname, self.appauthor, + version=self.version, multipath=self.multipath) + + @property + def user_config_dir(self): + return user_config_dir(self.appname, self.appauthor, + version=self.version, roaming=self.roaming) + + @property + def site_config_dir(self): + return site_config_dir(self.appname, self.appauthor, + version=self.version, multipath=self.multipath) + + @property + def user_cache_dir(self): + return user_cache_dir(self.appname, self.appauthor, + version=self.version) + + @property + def user_state_dir(self): + return user_state_dir(self.appname, self.appauthor, + version=self.version) + + @property + def user_log_dir(self): + return user_log_dir(self.appname, self.appauthor, + version=self.version) + + +#---- internal support stuff + +def _get_win_folder_from_registry(csidl_name): + """This is a fallback technique at best. I'm not sure if using the + registry for this guarantees us the correct answer for all CSIDL_* + names. + """ + if PY3: + import winreg as _winreg + else: + import _winreg + + shell_folder_name = { + "CSIDL_APPDATA": "AppData", + "CSIDL_COMMON_APPDATA": "Common AppData", + "CSIDL_LOCAL_APPDATA": "Local AppData", + }[csidl_name] + + key = _winreg.OpenKey( + _winreg.HKEY_CURRENT_USER, + r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" + ) + dir, type = _winreg.QueryValueEx(key, shell_folder_name) + return dir + + +def _get_win_folder_with_pywin32(csidl_name): + from win32com.shell import shellcon, shell + dir = shell.SHGetFolderPath(0, getattr(shellcon, csidl_name), 0, 0) + # Try to make this a unicode path because SHGetFolderPath does + # not return unicode strings when there is unicode data in the + # path. + try: + dir = unicode(dir) + + # Downgrade to short path name if have highbit chars. See + # . + has_high_char = False + for c in dir: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + try: + import win32api + dir = win32api.GetShortPathName(dir) + except ImportError: + pass + except UnicodeError: + pass + return dir + + +def _get_win_folder_with_ctypes(csidl_name): + import ctypes + + csidl_const = { + "CSIDL_APPDATA": 26, + "CSIDL_COMMON_APPDATA": 35, + "CSIDL_LOCAL_APPDATA": 28, + }[csidl_name] + + buf = ctypes.create_unicode_buffer(1024) + ctypes.windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf) + + # Downgrade to short path name if have highbit chars. See + # . + has_high_char = False + for c in buf: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + buf2 = ctypes.create_unicode_buffer(1024) + if ctypes.windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024): + buf = buf2 + + return buf.value + +def _get_win_folder_with_jna(csidl_name): + import array + from com.sun import jna + from com.sun.jna.platform import win32 + + buf_size = win32.WinDef.MAX_PATH * 2 + buf = array.zeros('c', buf_size) + shell = win32.Shell32.INSTANCE + shell.SHGetFolderPath(None, getattr(win32.ShlObj, csidl_name), None, win32.ShlObj.SHGFP_TYPE_CURRENT, buf) + dir = jna.Native.toString(buf.tostring()).rstrip("\0") + + # Downgrade to short path name if have highbit chars. See + # . + has_high_char = False + for c in dir: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + buf = array.zeros('c', buf_size) + kernel = win32.Kernel32.INSTANCE + if kernel.GetShortPathName(dir, buf, buf_size): + dir = jna.Native.toString(buf.tostring()).rstrip("\0") + + return dir + +if system == "win32": + try: + import win32com.shell + _get_win_folder = _get_win_folder_with_pywin32 + except ImportError: + try: + from ctypes import windll + _get_win_folder = _get_win_folder_with_ctypes + except ImportError: + try: + import com.sun.jna + _get_win_folder = _get_win_folder_with_jna + except ImportError: + _get_win_folder = _get_win_folder_from_registry + + +#---- self test code + +if __name__ == "__main__": + appname = "MyApp" + appauthor = "MyCompany" + + props = ("user_data_dir", + "user_config_dir", + "user_cache_dir", + "user_state_dir", + "user_log_dir", + "site_data_dir", + "site_config_dir") + + print("-- app dirs %s --" % __version__) + + print("-- app dirs (with optional 'version')") + dirs = AppDirs(appname, appauthor, version="1.0") + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) + + print("\n-- app dirs (without optional 'version')") + dirs = AppDirs(appname, appauthor) + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) + + print("\n-- app dirs (without optional 'appauthor')") + dirs = AppDirs(appname) + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) + + print("\n-- app dirs (with disabled 'appauthor')") + dirs = AppDirs(appname, appauthor=False) + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) diff --git a/cres/venv/lib/python3.8/site-packages/cachecontrol/__init__.py b/cres/venv/lib/python3.8/site-packages/cachecontrol/__init__.py new file mode 100644 index 000000000..a1bbbbe3b --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/cachecontrol/__init__.py @@ -0,0 +1,11 @@ +"""CacheControl import Interface. + +Make it easy to import from cachecontrol without long namespaces. +""" +__author__ = "Eric Larson" +__email__ = "eric@ionrock.org" +__version__ = "0.12.6" + +from .wrapper import CacheControl +from .adapter import CacheControlAdapter +from .controller import CacheController diff --git a/cres/venv/lib/python3.8/site-packages/cachecontrol/__pycache__/__init__.cpython-38.pyc b/cres/venv/lib/python3.8/site-packages/cachecontrol/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5948b91d37bb2d7d538f10c9e908e9baf3162199 GIT binary patch literal 562 zcmYjN%We}f6rD*Xnang5Nc@1eS!4`ULR}zKRI#W82nn(A0?VU2+_3L|+XW8!_49^I`4Ze7dMrABhIm^|EjntTp zRiP%fa1%DkGxVo+>Pl8V_@$k>idE>(zGjQ+w7L~?t8ar(5G*mS4Uov4Pa4)j>ZYzg ziJc}U5iR18r0_pv4Z#uF=gOzt&ZKSFCt`!&5HFmLEmnw4eY*GnMv{*LV(_Qu8o`YT z9)jF80XC=U%jVVV=FJ~mGh5{6`EVk{FNXNN5-rY#^s^ytHGE#w=aO?3BvQj)&hH;PTr=_qi6iEEcpu+FL{5{ZZaGI_| zSP7tCApFoWMcQ@UvV8rwCfXfMp~lf)ZTLXhn%4 zm6?&ZD{z6LYas1~gI@Fj zY-h(O@ciw;-+$}gBIF;~x%$}9c^_W&83;}|%}7}P(~z1z3mN>g%v#!^O$oQSojFT4 zbWPjIT1zkVOxw-cOF#4}`H1iq_g)b03H!_nJDffxgZ9_30~rr!)%oRQ^5hphUTGn} zrZ5O&y9aSH69+}EWszk&df8=zjRBy+oDrOnw(3p5@lfXjjt4XuwJO$My$B#1B) zIzCdBuY^qFEZx9iwkt=i;lw23tGp;m^HfKXM0k~BR#okpSj$xDG^uWwk@zqZ(NgGH z!IeawRDN>lAHTAd$fmLj3hAM?f2oa6)?gbdS2! zXC7tLCXBFeHun#{O@rb2i6#~9>lKf+2ycO} zd5Tntv#3!@jL| z5I=xd;Sh0r>H~xN@bjrn`_>-YW1Bk%*DwizJWen$&mTmIR6=U0KIF^NZfN9`mio$2 z$pI>Tg(Q&gG<0G>Cswk#&FO;48H_qxBo2GUkPIbTwB?wyQw!#_FsZ-9e8jfiE1+EI zp0fNiv)X~xe=w_oUbvc)`~&TSuA{r#9n{Qgjdce5MIF%e01KP%{)w1O>hjhL@3f`+ z+Z&Mgzyi$L)i?Dmr0909!Q`3mAoDjC?w_f2OK*PL{3Gr+L3anf2Q%Q^?Y**%BrmPf zi@sB0ZuT~Rz2MRZNCd;{hI@x6!7^T?`OziWgF*&tg+s_vV$!F!X(kg$7PBn1}{W*}U? z4~hg!;rWAY1~0NteHX+Z$r(BZvWIc#J!sJ_LuZ*Xz{V1n46M*kX6t+rWn!u;E1IrC z7qV)h#A|BU{hEe%O)ZG($cWCT=SO;WN#JVlI(?34OqIo~NH_0a$Kd}C#o@!OfCE(T z4X-mexL*g^T`+7aMd(0j&rT{A61rZiI`nU!L&bQx66FwiF%P>^WFl7PF!Lr&Tx0@? zXeCBs)t;_%C^bc&OY zmvtT6%ysRX)@|B@)h^q-_5YpuEsA1J!dD?EBW1s)qE%n2um*&kDcpCD>-%oa hW!(D;D1!_^Ro=t;OX1o8$neGm$bbf2)}`>X{sYhz5N`kg literal 0 HcmV?d00001 diff --git a/cres/venv/lib/python3.8/site-packages/cachecontrol/__pycache__/cache.cpython-38.pyc b/cres/venv/lib/python3.8/site-packages/cachecontrol/__pycache__/cache.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1ccccc452c5029c6ddae6e40ff84e652d7c97c38 GIT binary patch literal 1795 zcma)7&2AG(5bmBCkH?`l`RmJZrZ@0_(%gk1u|A3HgM^ z>hi$YhOKXb;AB8JnmLuH zMLw+D12LHqg@5-&$NO?5;-QqgOvMkC#0Kg3=;)|h){eO@uWQS^in7JxIy#=Cb9I|{YEV^2p!&6ra(*|WtO7Q$>bC)Sq6B8ncl_WkF zxiDgDCC}CpTJ1~`&3vK0K!%z+0B@6!?CwYW)jiW%=I!?oE&^J9zVD5J>nb zN$8Z8=QGrtMe91Q!qCdgVHzusGs8NLZRDVp6`4tJbXQm*B>x3Gb+gyd#yWn5i1}-_mr2)+1G3!a`{Oj< z+shR5(s$03PMwUtr<6P=f09S!G5K#vDd-D!&K6Vo;}RMp6wbt%URXjzaK3EAN=56Y zWl<6Shr%fX;eaDASBd;1|EwDb@lR@fg{+J2v030~zzUV>Z1* zxmWdg?^^GVJ9a3O7QLc~e`2k+b%OX7t9xQrilu~l&umYA&%(PEIPXv_miZaDtZg>UZ1+POVnaUqx6JSS zU%K+8v{57LtWC3~ghQ!P=mP3}5AXflZwy|K@(Nm?q4V|=u|pJY!!OSkx&n5p^+|5o z%<6Lx-m&$1Juz)EDV2vaoBL9$iSxNCa$7hi&^)^Ub;0mmnA!M+R@3YubESvLpGld> w#R7y@-fGE&u1xMTv#FEAN*5~$k0=^(_b~)?M2GZd7|;~YVcg}x-+F@e-;a&J*Z=?k literal 0 HcmV?d00001 diff --git a/cres/venv/lib/python3.8/site-packages/cachecontrol/__pycache__/controller.cpython-38.pyc b/cres/venv/lib/python3.8/site-packages/cachecontrol/__pycache__/controller.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2f0d7ee24e75b0bfbe6dd1c9868eeafbcbf880a6 GIT binary patch literal 7788 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 z KKU^;VR9oe3?s9hqNh0~XNmv%|eNGVpd1w?U-l1cm3tgp-$$m@$*{QCcI=T&3# z{^lkEjhoo(HCmJ1XaLOh@wK6mRvL}ReYcYZx6)#x!GdO^A-+p=hmLWx`xnRzX^YzhtiA5@FppX zdTHb~^X%J83D@+tjQdH3NL`*5n?bh+e_E7jHu~_Dnwepi3p;IhsdX)5KmXx*jYF8yG z%M#R+{UG+yw?5C_ilT?SLQkFH%C_n%6n6MC!{PT0XQ-do*JA?hk7s|r{dq&N`v-c^)y7r`Bv-|#3!uFVn-t*ui4ZNG0bletG`g3baSOby zN0S#0kCjQ1D!>eUCfxR=D#j3tJDj@}F}&fMhGPcbOZe<22uIGzj0ifTAlZz83=}ye z*Yuzj8Z<2*i6s{*1jMJ@T(0U3%dO>_o7lI4GPFADl?-g7o7HP#R^h~dChdMP(CuDP zbfszkXbMaW+a8a{I}ml8>_8gmBO_f}*eU0~RimZ*7HP6P~;iQa&Nb}SQv4Ih)gCI1bbvpfQNf35#j1vsh zO~V-D=VSaa3})mK>hy~K&K!jZ({l!O!VV02Z?SSih$HQ8vrCAwF`u^r6M;<`=5nA7 zyarW#e2~lJ{}gUqc=tQ;)xFzPPEPSH={ktXE}vO+C|! z8Rmee*J(n4t>_I!W%UIp?1vx-Wwgnfw9Xifu@9%)%lR&D{~u)xmZ!{NfMm==yek;d zOLj%B;8j&v9Uu>hL2I~?26UzdqKqJzr!pI9gSUJSds(kQe+jC29@XhaWBPb0PS5Y) z{b}?Rydc0!C{#=&7_-Y@#t~)!McTdj)fQ$YLwx4O^Dw{GMj4}LZ~7U!mPs?<^hU3 zR2W+iV*%P7K73*@B|W}~hO1F6T8kb;t8rvd2k&>u(xQ69>($?pS1j{ZM$apR-{4c= Iqqi3P3om0EqW}N^ literal 0 HcmV?d00001 diff --git a/cres/venv/lib/python3.8/site-packages/cachecontrol/__pycache__/serialize.cpython-38.pyc b/cres/venv/lib/python3.8/site-packages/cachecontrol/__pycache__/serialize.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b70a8dd12ca4927d80a5817d90f9fef601257857 GIT binary patch literal 4213 zcmbtX&2t<_74PnuotYi2Rkr{dr4(1d&W8htU>TEaVTRH6NE&Is z+%qdj%WM@@GTf3=DqMV6RdLZR2a4jvfxm+48^y_I4pik3^Lstol~!@gf!XTU)6-w? z_4~bFzx~DZw9oK-e(j&X{_I7@{zZ-BkB!EgC`l7SGRd2)p4Yt2Oe4$*7N!4)Nk5w2v+8BZS6OxH z33g;FRjyCp43p?~JBiv!oW?uRt+hOS-sreMv@*j>P&= zn`-F9*AAE}VTmsu);2q>sJ7netc9xfzUpj6jWnq}eE4von>QBXb{cJ{FpWFyg(MBz zGE_3DHB^+;cB1x9tr@S?y1VISr+sblwHl0!7P?_$JKVs4M%dWI=IvBg0;ioT0nVZsEN4(7WZK6jL8^%Ct*( zo0iUFH|B#v%(8-Xmzi`kd)rZe&urjM|FU7Y^RJ{!0h$NICG zE7`snc$o*yit5i8;XzZhX}xnS!%G>Z&`4A6; zn5dm<4#^QKJ)z$V| zNA7BOGYVy-673*Z(q5w79kdWU+EG!MPz}t11k^m%*Y-}RcE8}S{+q)4RkLTK@y62K zDzBG%NffNbZ9@gsc}20IzG)_5C8dvz14}^+HEBp6u-J)Osy8RokY!b?W*WOFT(I|&>Am6 z=-H8bf|1R(4AZb)hD~uK$6uYiTbJ@W*a@4x=)~cx%UJOYO0opOxGy|jDwTY}1^2l3 z)Uj-C;|=mZ_EUQX-*_3NWF+22fA*xC8ibV5L*DdIOf)^lOC}Ovb(Qt!Gcm;7AjQ4_ zimZY7C2OCxS<1J4wZwrTx(5cFJ{51O4&Cc(~c2USOXAD^^;k52k6r8>&6oOa>oFin+q);p>drn>w? zwBog1nvbg5>Ix<*!oMO%)GeU*gsXJHZ1f(w6T$%#aEdMXJY3=1v*aY}j3xM4QMM+W zVx~yBv&FR^ z7vL@z?)qEquDoyP$tk*h2W}3Jw73qcBgTI$@|FH5KA{V$-2crz@cjC2rPEUt3i`@n z&{W`u#%2W!80s;?H%uP%`= z6l8Tf-JFpw(zjP2bnz~7mK<%AmnjOls&|Aa?U;N(svpqkf}w%BN30pB@S$1PY=07O zv(Tm+swf!o%_in2#Ba=-1@zAHIqr$FnB%kHjgk-mV%a?-`Y#@1gp+Gb;E-a92>2$7 z2{#HwMRa6zIk1k5FlTvE!{R9RE`LHR5K}X|KYwid@qmeaCrF8c4w$2?4wvG<0_M&D za{`zHvgtRX2xNU0Xau-F)Dm$^siC?-;&l@5KpdQmX7v_zQKFR#lMan_zw#+M5|dGb zba8|@)MwgoLQkjSgmtN zRYvd2EcFf(nYjWnZs`w`y2LbGC4v_Fs7hX0ARX-^in-g1KL>y_bUEK`(6P zJtkYrl`xLGO*;LU#Lr3GA#s<)ku%L35so?yF^^*Y#KLb&-pk%a&+$BO-g8WEbw*KE zpv=|sQ+lI+UdD2L`Y;bo7W1pJ2aK7E2)7Fm7pCUg$?4D}z6NcCG413xrrF|InrUx2 XH}?kJ1qsceG!s8cM#a44*`EDhP&=Sl literal 0 HcmV?d00001 diff --git a/cres/venv/lib/python3.8/site-packages/cachecontrol/__pycache__/wrapper.cpython-38.pyc b/cres/venv/lib/python3.8/site-packages/cachecontrol/__pycache__/wrapper.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..165bae97948ef18ad037ced3db7f1626e69bde88 GIT binary patch literal 686 zcmYjPy^a$x5VpO)xg-dV2Jrw$TjX3^gAhWXP*Frk9L*L)&e~*`+dqw+i!O31Xn6-H z=@5^z9irk5&{d3g@1z~epT6LG_YC<=YG&z?+OU0O=rOdRrIuOG`ZlnUq+i2hY{@q!nT@|Q zN_y_yaTMjRlAxPrPS9EzvDMv)R#1qtI4I~Qx!OUYO_6o?vq5jEV4amh>+V7SmDrSO zT`7|{QXit+nD!axhu9H~Eb+iY#ehR3X;3x0+9Z?I*9r>+eF5-YJa7;?aHCD!*SG+7XyuC*4_4(OTt_!0Ut;jCL7881Lw@vdsh_+R5)?RnB<>>aDZ2cI4OiyV{ z*?8TA@r=$G%rTlotBaMhBmnoa`gwr6*kL>_r|)V6Gd%0!=T#$jrF!Asjy^@engOAs G_3u9&nX5Da literal 0 HcmV?d00001 diff --git a/cres/venv/lib/python3.8/site-packages/cachecontrol/_cmd.py b/cres/venv/lib/python3.8/site-packages/cachecontrol/_cmd.py new file mode 100644 index 000000000..ee8d60d10 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/cachecontrol/_cmd.py @@ -0,0 +1,57 @@ +import logging + +import requests + +from cachecontrol.adapter import CacheControlAdapter +from cachecontrol.cache import DictCache +from cachecontrol.controller import logger + +from argparse import ArgumentParser + + +def setup_logging(): + logger.setLevel(logging.DEBUG) + handler = logging.StreamHandler() + logger.addHandler(handler) + + +def get_session(): + adapter = CacheControlAdapter( + DictCache(), cache_etags=True, serializer=None, heuristic=None + ) + sess = requests.Session() + sess.mount("http://", adapter) + sess.mount("https://", adapter) + + sess.cache_controller = adapter.controller + return sess + + +def get_args(): + parser = ArgumentParser() + parser.add_argument("url", help="The URL to try and cache") + return parser.parse_args() + + +def main(args=None): + args = get_args() + sess = get_session() + + # Make a request to get a response + resp = sess.get(args.url) + + # Turn on logging + setup_logging() + + # try setting the cache + sess.cache_controller.cache_response(resp.request, resp.raw) + + # Now try to get it + if sess.cache_controller.cached_request(resp.request): + print("Cached!") + else: + print("Not cached :(") + + +if __name__ == "__main__": + main() diff --git a/cres/venv/lib/python3.8/site-packages/cachecontrol/adapter.py b/cres/venv/lib/python3.8/site-packages/cachecontrol/adapter.py new file mode 100644 index 000000000..de50006af --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/cachecontrol/adapter.py @@ -0,0 +1,133 @@ +import types +import functools +import zlib + +from requests.adapters import HTTPAdapter + +from .controller import CacheController +from .cache import DictCache +from .filewrapper import CallbackFileWrapper + + +class CacheControlAdapter(HTTPAdapter): + invalidating_methods = {"PUT", "DELETE"} + + def __init__( + self, + cache=None, + cache_etags=True, + controller_class=None, + serializer=None, + heuristic=None, + cacheable_methods=None, + *args, + **kw + ): + super(CacheControlAdapter, self).__init__(*args, **kw) + self.cache = DictCache() if cache is None else cache + self.heuristic = heuristic + self.cacheable_methods = cacheable_methods or ("GET",) + + controller_factory = controller_class or CacheController + self.controller = controller_factory( + self.cache, cache_etags=cache_etags, serializer=serializer + ) + + def send(self, request, cacheable_methods=None, **kw): + """ + Send a request. Use the request information to see if it + exists in the cache and cache the response if we need to and can. + """ + cacheable = cacheable_methods or self.cacheable_methods + if request.method in cacheable: + try: + cached_response = self.controller.cached_request(request) + except zlib.error: + cached_response = None + if cached_response: + return self.build_response(request, cached_response, from_cache=True) + + # check for etags and add headers if appropriate + request.headers.update(self.controller.conditional_headers(request)) + + resp = super(CacheControlAdapter, self).send(request, **kw) + + return resp + + def build_response( + self, request, response, from_cache=False, cacheable_methods=None + ): + """ + Build a response by making a request or using the cache. + + This will end up calling send and returning a potentially + cached response + """ + cacheable = cacheable_methods or self.cacheable_methods + if not from_cache and request.method in cacheable: + # Check for any heuristics that might update headers + # before trying to cache. + if self.heuristic: + response = self.heuristic.apply(response) + + # apply any expiration heuristics + if response.status == 304: + # We must have sent an ETag request. This could mean + # that we've been expired already or that we simply + # have an etag. In either case, we want to try and + # update the cache if that is the case. + cached_response = self.controller.update_cached_response( + request, response + ) + + if cached_response is not response: + from_cache = True + + # We are done with the server response, read a + # possible response body (compliant servers will + # not return one, but we cannot be 100% sure) and + # release the connection back to the pool. + response.read(decode_content=False) + response.release_conn() + + response = cached_response + + # We always cache the 301 responses + elif response.status == 301: + self.controller.cache_response(request, response) + else: + # Wrap the response file with a wrapper that will cache the + # response when the stream has been consumed. + response._fp = CallbackFileWrapper( + response._fp, + functools.partial( + self.controller.cache_response, request, response + ), + ) + if response.chunked: + super_update_chunk_length = response._update_chunk_length + + def _update_chunk_length(self): + super_update_chunk_length() + if self.chunk_left == 0: + self._fp._close() + + response._update_chunk_length = types.MethodType( + _update_chunk_length, response + ) + + resp = super(CacheControlAdapter, self).build_response(request, response) + + # See if we should invalidate the cache. + if request.method in self.invalidating_methods and resp.ok: + cache_url = self.controller.cache_url(request.url) + self.cache.delete(cache_url) + + # Give the request a from_cache attr to let people use it + resp.from_cache = from_cache + + return resp + + def close(self): + self.cache.close() + super(CacheControlAdapter, self).close() diff --git a/cres/venv/lib/python3.8/site-packages/cachecontrol/cache.py b/cres/venv/lib/python3.8/site-packages/cachecontrol/cache.py new file mode 100644 index 000000000..94e07732d --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/cachecontrol/cache.py @@ -0,0 +1,39 @@ +""" +The cache object API for implementing caches. The default is a thread +safe in-memory dictionary. +""" +from threading import Lock + + +class BaseCache(object): + + def get(self, key): + raise NotImplementedError() + + def set(self, key, value): + raise NotImplementedError() + + def delete(self, key): + raise NotImplementedError() + + def close(self): + pass + + +class DictCache(BaseCache): + + def __init__(self, init_dict=None): + self.lock = Lock() + self.data = init_dict or {} + + def get(self, key): + return self.data.get(key, None) + + def set(self, key, value): + with self.lock: + self.data.update({key: value}) + + def delete(self, key): + with self.lock: + if key in self.data: + self.data.pop(key) diff --git a/cres/venv/lib/python3.8/site-packages/cachecontrol/caches/__init__.py b/cres/venv/lib/python3.8/site-packages/cachecontrol/caches/__init__.py new file mode 100644 index 000000000..0e1658fa5 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/cachecontrol/caches/__init__.py @@ -0,0 +1,2 @@ +from .file_cache import FileCache # noqa +from .redis_cache import RedisCache # noqa diff --git a/cres/venv/lib/python3.8/site-packages/cachecontrol/caches/__pycache__/__init__.cpython-38.pyc b/cres/venv/lib/python3.8/site-packages/cachecontrol/caches/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a34d309ae292e5a2bcaf9c40da61cc7262be7dc1 GIT binary patch literal 306 zcmYk1y-ve05Xa*r0|fd8yg-KZhAs>UAt5m$1cD(0mTO-dgJVawY1DxSV&i$bAtqjd zspph|lkVep|I_L2aW<LxSoal@1f#)@56*NaHezKCNy~eA53q1$90$Us9UF?>ls^M_4(x z6dvxpdqEikjN{l02WYg7xb`AyXPXd(Rl=(P(qn)P+6@@Jgkc*yXBYEx2s&aj2>B}3 kG%(#EosHg^0|ek)TOB!{58K_*Meo#`!OQenNcWzyJ)F5!J^%m! literal 0 HcmV?d00001 diff --git a/cres/venv/lib/python3.8/site-packages/cachecontrol/caches/__pycache__/file_cache.cpython-38.pyc b/cres/venv/lib/python3.8/site-packages/cachecontrol/caches/__pycache__/file_cache.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..70ab4bc423d958aa430bff61b8473ae33bb3c3a9 GIT binary patch literal 3280 zcmZWrTW=f36`q;BaJiyrSqL1*b&E}#UTDN3YP&_^8bM;gE?lT&D?61<6kV)2Lz5D@ z%g(MOn^?9*v7p=u`UCpU~eiZ$+N`6VjLVJF_Mw*-Ols+nM3HerG;kT@4w& zf8G4g?>=5*>}#5w{Q^urMa%yHBAMi4)~kBn`uI%XUE>ypVWFa z&SrrMINM?ARhOyyUZ@{)Mn4s*m4WC5Pgp7*GwI9POV(@roXJ4eUou%&-jUN=m7!e0 zdQ<6KUA1pu!GGkEp#>>E8Qoi#phyBN83cp zk3kBy%jcpL=&3n(S(nX4;TBN!Na$;J$6KxmtbJnFd|I0|3wB&9*$KBQUUpd#6!n3C znzB-}QV(2V$x2c36KC$&Q!Aw-ofEOc9$Is7NOIgL9lGfY_Sz`eYq=d0cH>U>es^oD zyJLcGeD^`;v+XBF96oKW8j!k$OjOSsOfspAHy9_+ zaw7)vE2iJYo&Wt~dzejBdyr*M6W#um&URJ5$lHg9hu5do$70%5}U*W8eY4w@@?ldof?$uSbX2)TX_Jbhw3`+1mrik9C6 zQH+AUC*(!xN&hA9Im(qa8N6giyywZf3=yQhT#*g*HMuIA=mU8{uA#3>7k*qf_4^Rn z2Iu`(f8vb2`Zq|YPfl5Ul#7&cHa!1^LFq}hSJ#(Izv^vR@-O)8sua>0^NE-v$1rxs z&cvNpnf3v~&^yhv!k69=pVteotRLYlg6r~Q+^l68%>A@s?+)~|tj+zBmn^O!P+1(5 z4rsk}LBrAqU6B-!erML+Owu$fqWxS^i{(hiQDd#smF6&g<_I`5uuEKzfa{?$F<-b&{(3cOO0*^_5N8id@E?3F3H^j*2+G zjamK!5EicSKnUL8YsePC#sAz|({Z^k0`3Z*SHIc%(it0zEBfT=#YbZTTpP{n7y#lB zU&rDEfO+hkAez479Uu&$)DQq*{Ct?)xN*z)D(w@})Q9T19039fL=1oahUEG~+?k-| zWJ)GxYo`KL7rcf2OL1=D07PLxWZ-|nOF_l$&*D8~bSa+kciG%2#ICc8@Za?YymbC9 z{z~C5IZvx^eM=R>3TxSI3{F*ddYb{1~3wb&g%C zo8+exv8=;>QL}aU&O$YMX5chn?Sy}MZSEF;wp~EnZU|GY&Ark)UMWRY$tz=#i54R= ziEcrFR--bAb$KvJ_7rk7*FVOVp>!o@+g#LCfHdAztja^GGB#6OS!IpMtf9TD`GR%$yKqBrJQbs2_3<&@O7kRL#&-MBlyn63z>9TS3bgIX+|LZ zF3)e_Ng|G&h5G3`hzl2SapSDCmnZ>oTo+gKIq2)xTc z@TnBzcQ$`3ww8Bae~a$E3exES`T$mB;W##790MBn@d}7dBaVN+pNy*={Ub1&2B05k zH$ef)q|Mbz=sR@XT_Th`XT-C%CNt|RAY`PRW`Xzmea6{0;SU9j9@K(*(6n4{8JP@C z_vY__RB%W5QX*2xxWErS`|UQosMCnb*?`JapPn}np-1!-4_O&y)#m5hTN|M*J&%T? zJd&BpBPzQp&GFPZJ+GbvgYx$+CmcZVWa{?PcwdjL+AYU8829S*hjz=x-5K>sSF;A5 zxX5DSib+J7wB6T^fh!94wALQ|ANCsZ`~Uy| literal 0 HcmV?d00001 diff --git a/cres/venv/lib/python3.8/site-packages/cachecontrol/caches/__pycache__/redis_cache.cpython-38.pyc b/cres/venv/lib/python3.8/site-packages/cachecontrol/caches/__pycache__/redis_cache.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5f09eb7e35e4c53e746be2f6011e909dd12908f8 GIT binary patch literal 1566 zcmZ`(&2HQ_5GF-QD{pok_dh+A1$q$>uMWB75F|lUpe;}=iW<2HXa!oNy-Kv=hU9u< zLjelJ58^%g*5}c!=&7&JQ)eg(-Wn+Zl0yzhGv7BedO4kr35-7;{rTHZjF7+ZuscFH zJcnr?!y<{KHCfV}Qj~)_SO$6EWmdCgn1_^nPh=>gOClo`zGrzP<0F!e{swE3(k_wJ zS!FBTcv(2*s-*&X?^|Kj3sEjqi7$5tMAb*|6a+_h28%iJZco$Oz)N-;IA!va-FWV8;#0IA6fDNJ&duQUJ;$a!uzDVOZ*> zNrNu5sy;CzcyUe49&G>oo-OoJWhYu63zPk9^ea_5n{76m!&QGctQx0Ijc@?`&^pmb zVWiDUqilAjnzO8~j~Ur*rw&)5d@WAlLFrl1jWfFL4>mIhqVSs8>by&e zqG~Ev6c~^7u;|4nw@7D$zPt+=$@P#YAhhHaxuPxI(j#JGxJUyJv}32rT?ZzCtB$=^ z=N@;zAXNs9aSpEccU*(%yu>OR2Fmzx@Ae4@Ewi5vuG?S>_0)XRG8bI2EqOrRF|P|- z>Y|oi#ar^8!YhVVH-tI53DYWP5K$MeUD@bO9>I-z+cDt3n>y`8U04N)lr{}L9J7zl zqcc&jRX0*^R~6*sF1-8j2B$>=2o32$FrgQ_Ai>T5Q+ohL1HP^AoFVQTdSj_-h|^5r z;a%UK!QJOD2Wmgsp|&?GDX52m`9*>~xg3Pv@s@l?em!^xB@G!4FvFC*8B54>8eIJN zgQ{1`@Dpu#Su0_x=9G)N=5C=lWZUwp;et!y#4&W~jK8#sZz{JK^P5qMHJ0|*^OW_O z2+_=7>>mQvMc&Pqptim;*gm~D*a7C%|G|YAae7>6a})bBZ^hSES&j_~od<#NmDV+& zc*q;g8>J+78lY*28!_EJoXtJoDea2^+vm2dF-$P|3NCy0gF8WjGKGJ`9`;`&mZ~Va zaZxO_T-PX1isH>$)V;>s!*64g7%Zipn=ep$fXl6CFZr&DK!N`mi&jaHu!N0Au*L>8 w^E5_pCu_Gh;LTv>eevfXmpgxqnLik$%$t44QTWrn=RQQDb3!9l%VE_OC literal 0 HcmV?d00001 diff --git a/cres/venv/lib/python3.8/site-packages/cachecontrol/caches/file_cache.py b/cres/venv/lib/python3.8/site-packages/cachecontrol/caches/file_cache.py new file mode 100644 index 000000000..607b94524 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/cachecontrol/caches/file_cache.py @@ -0,0 +1,146 @@ +import hashlib +import os +from textwrap import dedent + +from ..cache import BaseCache +from ..controller import CacheController + +try: + FileNotFoundError +except NameError: + # py2.X + FileNotFoundError = (IOError, OSError) + + +def _secure_open_write(filename, fmode): + # We only want to write to this file, so open it in write only mode + flags = os.O_WRONLY + + # os.O_CREAT | os.O_EXCL will fail if the file already exists, so we only + # will open *new* files. + # We specify this because we want to ensure that the mode we pass is the + # mode of the file. + flags |= os.O_CREAT | os.O_EXCL + + # Do not follow symlinks to prevent someone from making a symlink that + # we follow and insecurely open a cache file. + if hasattr(os, "O_NOFOLLOW"): + flags |= os.O_NOFOLLOW + + # On Windows we'll mark this file as binary + if hasattr(os, "O_BINARY"): + flags |= os.O_BINARY + + # Before we open our file, we want to delete any existing file that is + # there + try: + os.remove(filename) + except (IOError, OSError): + # The file must not exist already, so we can just skip ahead to opening + pass + + # Open our file, the use of os.O_CREAT | os.O_EXCL will ensure that if a + # race condition happens between the os.remove and this line, that an + # error will be raised. Because we utilize a lockfile this should only + # happen if someone is attempting to attack us. + fd = os.open(filename, flags, fmode) + try: + return os.fdopen(fd, "wb") + + except: + # An error occurred wrapping our FD in a file object + os.close(fd) + raise + + +class FileCache(BaseCache): + + def __init__( + self, + directory, + forever=False, + filemode=0o0600, + dirmode=0o0700, + use_dir_lock=None, + lock_class=None, + ): + + if use_dir_lock is not None and lock_class is not None: + raise ValueError("Cannot use use_dir_lock and lock_class together") + + try: + from lockfile import LockFile + from lockfile.mkdirlockfile import MkdirLockFile + except ImportError: + notice = dedent( + """ + NOTE: In order to use the FileCache you must have + lockfile installed. You can install it via pip: + pip install lockfile + """ + ) + raise ImportError(notice) + + else: + if use_dir_lock: + lock_class = MkdirLockFile + + elif lock_class is None: + lock_class = LockFile + + self.directory = directory + self.forever = forever + self.filemode = filemode + self.dirmode = dirmode + self.lock_class = lock_class + + @staticmethod + def encode(x): + return hashlib.sha224(x.encode()).hexdigest() + + def _fn(self, name): + # NOTE: This method should not change as some may depend on it. + # See: https://github.com/ionrock/cachecontrol/issues/63 + hashed = self.encode(name) + parts = list(hashed[:5]) + [hashed] + return os.path.join(self.directory, *parts) + + def get(self, key): + name = self._fn(key) + try: + with open(name, "rb") as fh: + return fh.read() + + except FileNotFoundError: + return None + + def set(self, key, value): + name = self._fn(key) + + # Make sure the directory exists + try: + os.makedirs(os.path.dirname(name), self.dirmode) + except (IOError, OSError): + pass + + with self.lock_class(name) as lock: + # Write our actual file + with _secure_open_write(lock.path, self.filemode) as fh: + fh.write(value) + + def delete(self, key): + name = self._fn(key) + if not self.forever: + try: + os.remove(name) + except FileNotFoundError: + pass + + +def url_to_file_path(url, filecache): + """Return the file cache path based on the URL. + + This does not ensure the file exists! + """ + key = CacheController.cache_url(url) + return filecache._fn(key) diff --git a/cres/venv/lib/python3.8/site-packages/cachecontrol/caches/redis_cache.py b/cres/venv/lib/python3.8/site-packages/cachecontrol/caches/redis_cache.py new file mode 100644 index 000000000..16da0aed9 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/cachecontrol/caches/redis_cache.py @@ -0,0 +1,33 @@ +from __future__ import division + +from datetime import datetime +from cachecontrol.cache import BaseCache + + +class RedisCache(BaseCache): + + def __init__(self, conn): + self.conn = conn + + def get(self, key): + return self.conn.get(key) + + def set(self, key, value, expires=None): + if not expires: + self.conn.set(key, value) + else: + expires = expires - datetime.utcnow() + self.conn.setex(key, int(expires.total_seconds()), value) + + def delete(self, key): + self.conn.delete(key) + + def clear(self): + """Helper for clearing all the keys in a database. Use with + caution!""" + for key in self.conn.keys(): + self.conn.delete(key) + + def close(self): + """Redis uses connection pooling, no need to close the connection.""" + pass diff --git a/cres/venv/lib/python3.8/site-packages/cachecontrol/compat.py b/cres/venv/lib/python3.8/site-packages/cachecontrol/compat.py new file mode 100644 index 000000000..143c8ab08 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/cachecontrol/compat.py @@ -0,0 +1,29 @@ +try: + from urllib.parse import urljoin +except ImportError: + from urlparse import urljoin + + +try: + import cPickle as pickle +except ImportError: + import pickle + + +# Handle the case where the requests module has been patched to not have +# urllib3 bundled as part of its source. +try: + from requests.packages.urllib3.response import HTTPResponse +except ImportError: + from urllib3.response import HTTPResponse + +try: + from requests.packages.urllib3.util import is_fp_closed +except ImportError: + from urllib3.util import is_fp_closed + +# Replicate some six behaviour +try: + text_type = unicode +except NameError: + text_type = str diff --git a/cres/venv/lib/python3.8/site-packages/cachecontrol/controller.py b/cres/venv/lib/python3.8/site-packages/cachecontrol/controller.py new file mode 100644 index 000000000..c5c4a5080 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/cachecontrol/controller.py @@ -0,0 +1,376 @@ +""" +The httplib2 algorithms ported for use with requests. +""" +import logging +import re +import calendar +import time +from email.utils import parsedate_tz + +from requests.structures import CaseInsensitiveDict + +from .cache import DictCache +from .serialize import Serializer + + +logger = logging.getLogger(__name__) + +URI = re.compile(r"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?") + + +def parse_uri(uri): + """Parses a URI using the regex given in Appendix B of RFC 3986. + + (scheme, authority, path, query, fragment) = parse_uri(uri) + """ + groups = URI.match(uri).groups() + return (groups[1], groups[3], groups[4], groups[6], groups[8]) + + +class CacheController(object): + """An interface to see if request should cached or not. + """ + + def __init__( + self, cache=None, cache_etags=True, serializer=None, status_codes=None + ): + self.cache = DictCache() if cache is None else cache + self.cache_etags = cache_etags + self.serializer = serializer or Serializer() + self.cacheable_status_codes = status_codes or (200, 203, 300, 301) + + @classmethod + def _urlnorm(cls, uri): + """Normalize the URL to create a safe key for the cache""" + (scheme, authority, path, query, fragment) = parse_uri(uri) + if not scheme or not authority: + raise Exception("Only absolute URIs are allowed. uri = %s" % uri) + + scheme = scheme.lower() + authority = authority.lower() + + if not path: + path = "/" + + # Could do syntax based normalization of the URI before + # computing the digest. See Section 6.2.2 of Std 66. + request_uri = query and "?".join([path, query]) or path + defrag_uri = scheme + "://" + authority + request_uri + + return defrag_uri + + @classmethod + def cache_url(cls, uri): + return cls._urlnorm(uri) + + def parse_cache_control(self, headers): + known_directives = { + # https://tools.ietf.org/html/rfc7234#section-5.2 + "max-age": (int, True), + "max-stale": (int, False), + "min-fresh": (int, True), + "no-cache": (None, False), + "no-store": (None, False), + "no-transform": (None, False), + "only-if-cached": (None, False), + "must-revalidate": (None, False), + "public": (None, False), + "private": (None, False), + "proxy-revalidate": (None, False), + "s-maxage": (int, True), + } + + cc_headers = headers.get("cache-control", headers.get("Cache-Control", "")) + + retval = {} + + for cc_directive in cc_headers.split(","): + if not cc_directive.strip(): + continue + + parts = cc_directive.split("=", 1) + directive = parts[0].strip() + + try: + typ, required = known_directives[directive] + except KeyError: + logger.debug("Ignoring unknown cache-control directive: %s", directive) + continue + + if not typ or not required: + retval[directive] = None + if typ: + try: + retval[directive] = typ(parts[1].strip()) + except IndexError: + if required: + logger.debug( + "Missing value for cache-control " "directive: %s", + directive, + ) + except ValueError: + logger.debug( + "Invalid value for cache-control directive " "%s, must be %s", + directive, + typ.__name__, + ) + + return retval + + def cached_request(self, request): + """ + Return a cached response if it exists in the cache, otherwise + return False. + """ + cache_url = self.cache_url(request.url) + logger.debug('Looking up "%s" in the cache', cache_url) + cc = self.parse_cache_control(request.headers) + + # Bail out if the request insists on fresh data + if "no-cache" in cc: + logger.debug('Request header has "no-cache", cache bypassed') + return False + + if "max-age" in cc and cc["max-age"] == 0: + logger.debug('Request header has "max_age" as 0, cache bypassed') + return False + + # Request allows serving from the cache, let's see if we find something + cache_data = self.cache.get(cache_url) + if cache_data is None: + logger.debug("No cache entry available") + return False + + # Check whether it can be deserialized + resp = self.serializer.loads(request, cache_data) + if not resp: + logger.warning("Cache entry deserialization failed, entry ignored") + return False + + # If we have a cached 301, return it immediately. We don't + # need to test our response for other headers b/c it is + # intrinsically "cacheable" as it is Permanent. + # See: + # https://tools.ietf.org/html/rfc7231#section-6.4.2 + # + # Client can try to refresh the value by repeating the request + # with cache busting headers as usual (ie no-cache). + if resp.status == 301: + msg = ( + 'Returning cached "301 Moved Permanently" response ' + "(ignoring date and etag information)" + ) + logger.debug(msg) + return resp + + headers = CaseInsensitiveDict(resp.headers) + if not headers or "date" not in headers: + if "etag" not in headers: + # Without date or etag, the cached response can never be used + # and should be deleted. + logger.debug("Purging cached response: no date or etag") + self.cache.delete(cache_url) + logger.debug("Ignoring cached response: no date") + return False + + now = time.time() + date = calendar.timegm(parsedate_tz(headers["date"])) + current_age = max(0, now - date) + logger.debug("Current age based on date: %i", current_age) + + # TODO: There is an assumption that the result will be a + # urllib3 response object. This may not be best since we + # could probably avoid instantiating or constructing the + # response until we know we need it. + resp_cc = self.parse_cache_control(headers) + + # determine freshness + freshness_lifetime = 0 + + # Check the max-age pragma in the cache control header + if "max-age" in resp_cc: + freshness_lifetime = resp_cc["max-age"] + logger.debug("Freshness lifetime from max-age: %i", freshness_lifetime) + + # If there isn't a max-age, check for an expires header + elif "expires" in headers: + expires = parsedate_tz(headers["expires"]) + if expires is not None: + expire_time = calendar.timegm(expires) - date + freshness_lifetime = max(0, expire_time) + logger.debug("Freshness lifetime from expires: %i", freshness_lifetime) + + # Determine if we are setting freshness limit in the + # request. Note, this overrides what was in the response. + if "max-age" in cc: + freshness_lifetime = cc["max-age"] + logger.debug( + "Freshness lifetime from request max-age: %i", freshness_lifetime + ) + + if "min-fresh" in cc: + min_fresh = cc["min-fresh"] + # adjust our current age by our min fresh + current_age += min_fresh + logger.debug("Adjusted current age from min-fresh: %i", current_age) + + # Return entry if it is fresh enough + if freshness_lifetime > current_age: + logger.debug('The response is "fresh", returning cached response') + logger.debug("%i > %i", freshness_lifetime, current_age) + return resp + + # we're not fresh. If we don't have an Etag, clear it out + if "etag" not in headers: + logger.debug('The cached response is "stale" with no etag, purging') + self.cache.delete(cache_url) + + # return the original handler + return False + + def conditional_headers(self, request): + cache_url = self.cache_url(request.url) + resp = self.serializer.loads(request, self.cache.get(cache_url)) + new_headers = {} + + if resp: + headers = CaseInsensitiveDict(resp.headers) + + if "etag" in headers: + new_headers["If-None-Match"] = headers["ETag"] + + if "last-modified" in headers: + new_headers["If-Modified-Since"] = headers["Last-Modified"] + + return new_headers + + def cache_response(self, request, response, body=None, status_codes=None): + """ + Algorithm for caching requests. + + This assumes a requests Response object. + """ + # From httplib2: Don't cache 206's since we aren't going to + # handle byte range requests + cacheable_status_codes = status_codes or self.cacheable_status_codes + if response.status not in cacheable_status_codes: + logger.debug( + "Status code %s not in %s", response.status, cacheable_status_codes + ) + return + + response_headers = CaseInsensitiveDict(response.headers) + + # If we've been given a body, our response has a Content-Length, that + # Content-Length is valid then we can check to see if the body we've + # been given matches the expected size, and if it doesn't we'll just + # skip trying to cache it. + if ( + body is not None + and "content-length" in response_headers + and response_headers["content-length"].isdigit() + and int(response_headers["content-length"]) != len(body) + ): + return + + cc_req = self.parse_cache_control(request.headers) + cc = self.parse_cache_control(response_headers) + + cache_url = self.cache_url(request.url) + logger.debug('Updating cache with response from "%s"', cache_url) + + # Delete it from the cache if we happen to have it stored there + no_store = False + if "no-store" in cc: + no_store = True + logger.debug('Response header has "no-store"') + if "no-store" in cc_req: + no_store = True + logger.debug('Request header has "no-store"') + if no_store and self.cache.get(cache_url): + logger.debug('Purging existing cache entry to honor "no-store"') + self.cache.delete(cache_url) + if no_store: + return + + # https://tools.ietf.org/html/rfc7234#section-4.1: + # A Vary header field-value of "*" always fails to match. + # Storing such a response leads to a deserialization warning + # during cache lookup and is not allowed to ever be served, + # so storing it can be avoided. + if "*" in response_headers.get("vary", ""): + logger.debug('Response header has "Vary: *"') + return + + # If we've been given an etag, then keep the response + if self.cache_etags and "etag" in response_headers: + logger.debug("Caching due to etag") + self.cache.set( + cache_url, self.serializer.dumps(request, response, body=body) + ) + + # Add to the cache any 301s. We do this before looking that + # the Date headers. + elif response.status == 301: + logger.debug("Caching permanant redirect") + self.cache.set(cache_url, self.serializer.dumps(request, response)) + + # Add to the cache if the response headers demand it. If there + # is no date header then we can't do anything about expiring + # the cache. + elif "date" in response_headers: + # cache when there is a max-age > 0 + if "max-age" in cc and cc["max-age"] > 0: + logger.debug("Caching b/c date exists and max-age > 0") + self.cache.set( + cache_url, self.serializer.dumps(request, response, body=body) + ) + + # If the request can expire, it means we should cache it + # in the meantime. + elif "expires" in response_headers: + if response_headers["expires"]: + logger.debug("Caching b/c of expires header") + self.cache.set( + cache_url, self.serializer.dumps(request, response, body=body) + ) + + def update_cached_response(self, request, response): + """On a 304 we will get a new set of headers that we want to + update our cached value with, assuming we have one. + + This should only ever be called when we've sent an ETag and + gotten a 304 as the response. + """ + cache_url = self.cache_url(request.url) + + cached_response = self.serializer.loads(request, self.cache.get(cache_url)) + + if not cached_response: + # we didn't have a cached response + return response + + # Lets update our headers with the headers from the new request: + # http://tools.ietf.org/html/draft-ietf-httpbis-p4-conditional-26#section-4.1 + # + # The server isn't supposed to send headers that would make + # the cached body invalid. But... just in case, we'll be sure + # to strip out ones we know that might be problmatic due to + # typical assumptions. + excluded_headers = ["content-length"] + + cached_response.headers.update( + dict( + (k, v) + for k, v in response.headers.items() + if k.lower() not in excluded_headers + ) + ) + + # we want a 200 b/c we have content via the cache + cached_response.status = 200 + + # update our cache + self.cache.set(cache_url, self.serializer.dumps(request, cached_response)) + + return cached_response diff --git a/cres/venv/lib/python3.8/site-packages/cachecontrol/filewrapper.py b/cres/venv/lib/python3.8/site-packages/cachecontrol/filewrapper.py new file mode 100644 index 000000000..30ed4c5a6 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/cachecontrol/filewrapper.py @@ -0,0 +1,80 @@ +from io import BytesIO + + +class CallbackFileWrapper(object): + """ + Small wrapper around a fp object which will tee everything read into a + buffer, and when that file is closed it will execute a callback with the + contents of that buffer. + + All attributes are proxied to the underlying file object. + + This class uses members with a double underscore (__) leading prefix so as + not to accidentally shadow an attribute. + """ + + def __init__(self, fp, callback): + self.__buf = BytesIO() + self.__fp = fp + self.__callback = callback + + def __getattr__(self, name): + # The vaguaries of garbage collection means that self.__fp is + # not always set. By using __getattribute__ and the private + # name[0] allows looking up the attribute value and raising an + # AttributeError when it doesn't exist. This stop thigns from + # infinitely recursing calls to getattr in the case where + # self.__fp hasn't been set. + # + # [0] https://docs.python.org/2/reference/expressions.html#atom-identifiers + fp = self.__getattribute__("_CallbackFileWrapper__fp") + return getattr(fp, name) + + def __is_fp_closed(self): + try: + return self.__fp.fp is None + + except AttributeError: + pass + + try: + return self.__fp.closed + + except AttributeError: + pass + + # We just don't cache it then. + # TODO: Add some logging here... + return False + + def _close(self): + if self.__callback: + self.__callback(self.__buf.getvalue()) + + # We assign this to None here, because otherwise we can get into + # really tricky problems where the CPython interpreter dead locks + # because the callback is holding a reference to something which + # has a __del__ method. Setting this to None breaks the cycle + # and allows the garbage collector to do it's thing normally. + self.__callback = None + + def read(self, amt=None): + data = self.__fp.read(amt) + self.__buf.write(data) + if self.__is_fp_closed(): + self._close() + + return data + + def _safe_read(self, amt): + data = self.__fp._safe_read(amt) + if amt == 2 and data == b"\r\n": + # urllib executes this read to toss the CRLF at the end + # of the chunk. + return data + + self.__buf.write(data) + if self.__is_fp_closed(): + self._close() + + return data diff --git a/cres/venv/lib/python3.8/site-packages/cachecontrol/heuristics.py b/cres/venv/lib/python3.8/site-packages/cachecontrol/heuristics.py new file mode 100644 index 000000000..6c0e9790d --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/cachecontrol/heuristics.py @@ -0,0 +1,135 @@ +import calendar +import time + +from email.utils import formatdate, parsedate, parsedate_tz + +from datetime import datetime, timedelta + +TIME_FMT = "%a, %d %b %Y %H:%M:%S GMT" + + +def expire_after(delta, date=None): + date = date or datetime.utcnow() + return date + delta + + +def datetime_to_header(dt): + return formatdate(calendar.timegm(dt.timetuple())) + + +class BaseHeuristic(object): + + def warning(self, response): + """ + Return a valid 1xx warning header value describing the cache + adjustments. + + The response is provided too allow warnings like 113 + http://tools.ietf.org/html/rfc7234#section-5.5.4 where we need + to explicitly say response is over 24 hours old. + """ + return '110 - "Response is Stale"' + + def update_headers(self, response): + """Update the response headers with any new headers. + + NOTE: This SHOULD always include some Warning header to + signify that the response was cached by the client, not + by way of the provided headers. + """ + return {} + + def apply(self, response): + updated_headers = self.update_headers(response) + + if updated_headers: + response.headers.update(updated_headers) + warning_header_value = self.warning(response) + if warning_header_value is not None: + response.headers.update({"Warning": warning_header_value}) + + return response + + +class OneDayCache(BaseHeuristic): + """ + Cache the response by providing an expires 1 day in the + future. + """ + + def update_headers(self, response): + headers = {} + + if "expires" not in response.headers: + date = parsedate(response.headers["date"]) + expires = expire_after(timedelta(days=1), date=datetime(*date[:6])) + headers["expires"] = datetime_to_header(expires) + headers["cache-control"] = "public" + return headers + + +class ExpiresAfter(BaseHeuristic): + """ + Cache **all** requests for a defined time period. + """ + + def __init__(self, **kw): + self.delta = timedelta(**kw) + + def update_headers(self, response): + expires = expire_after(self.delta) + return {"expires": datetime_to_header(expires), "cache-control": "public"} + + def warning(self, response): + tmpl = "110 - Automatically cached for %s. Response might be stale" + return tmpl % self.delta + + +class LastModified(BaseHeuristic): + """ + If there is no Expires header already, fall back on Last-Modified + using the heuristic from + http://tools.ietf.org/html/rfc7234#section-4.2.2 + to calculate a reasonable value. + + Firefox also does something like this per + https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching_FAQ + http://lxr.mozilla.org/mozilla-release/source/netwerk/protocol/http/nsHttpResponseHead.cpp#397 + Unlike mozilla we limit this to 24-hr. + """ + cacheable_by_default_statuses = { + 200, 203, 204, 206, 300, 301, 404, 405, 410, 414, 501 + } + + def update_headers(self, resp): + headers = resp.headers + + if "expires" in headers: + return {} + + if "cache-control" in headers and headers["cache-control"] != "public": + return {} + + if resp.status not in self.cacheable_by_default_statuses: + return {} + + if "date" not in headers or "last-modified" not in headers: + return {} + + date = calendar.timegm(parsedate_tz(headers["date"])) + last_modified = parsedate(headers["last-modified"]) + if date is None or last_modified is None: + return {} + + now = time.time() + current_age = max(0, now - date) + delta = date - calendar.timegm(last_modified) + freshness_lifetime = max(0, min(delta / 10, 24 * 3600)) + if freshness_lifetime <= current_age: + return {} + + expires = date + freshness_lifetime + return {"expires": time.strftime(TIME_FMT, time.gmtime(expires))} + + def warning(self, resp): + return None diff --git a/cres/venv/lib/python3.8/site-packages/cachecontrol/serialize.py b/cres/venv/lib/python3.8/site-packages/cachecontrol/serialize.py new file mode 100644 index 000000000..572cf0e6c --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/cachecontrol/serialize.py @@ -0,0 +1,188 @@ +import base64 +import io +import json +import zlib + +import msgpack +from requests.structures import CaseInsensitiveDict + +from .compat import HTTPResponse, pickle, text_type + + +def _b64_decode_bytes(b): + return base64.b64decode(b.encode("ascii")) + + +def _b64_decode_str(s): + return _b64_decode_bytes(s).decode("utf8") + + +class Serializer(object): + + def dumps(self, request, response, body=None): + response_headers = CaseInsensitiveDict(response.headers) + + if body is None: + body = response.read(decode_content=False) + + # NOTE: 99% sure this is dead code. I'm only leaving it + # here b/c I don't have a test yet to prove + # it. Basically, before using + # `cachecontrol.filewrapper.CallbackFileWrapper`, + # this made an effort to reset the file handle. The + # `CallbackFileWrapper` short circuits this code by + # setting the body as the content is consumed, the + # result being a `body` argument is *always* passed + # into cache_response, and in turn, + # `Serializer.dump`. + response._fp = io.BytesIO(body) + + # NOTE: This is all a bit weird, but it's really important that on + # Python 2.x these objects are unicode and not str, even when + # they contain only ascii. The problem here is that msgpack + # understands the difference between unicode and bytes and we + # have it set to differentiate between them, however Python 2 + # doesn't know the difference. Forcing these to unicode will be + # enough to have msgpack know the difference. + data = { + u"response": { + u"body": body, + u"headers": dict( + (text_type(k), text_type(v)) for k, v in response.headers.items() + ), + u"status": response.status, + u"version": response.version, + u"reason": text_type(response.reason), + u"strict": response.strict, + u"decode_content": response.decode_content, + } + } + + # Construct our vary headers + data[u"vary"] = {} + if u"vary" in response_headers: + varied_headers = response_headers[u"vary"].split(",") + for header in varied_headers: + header = text_type(header).strip() + header_value = request.headers.get(header, None) + if header_value is not None: + header_value = text_type(header_value) + data[u"vary"][header] = header_value + + return b",".join([b"cc=4", msgpack.dumps(data, use_bin_type=True)]) + + def loads(self, request, data): + # Short circuit if we've been given an empty set of data + if not data: + return + + # Determine what version of the serializer the data was serialized + # with + try: + ver, data = data.split(b",", 1) + except ValueError: + ver = b"cc=0" + + # Make sure that our "ver" is actually a version and isn't a false + # positive from a , being in the data stream. + if ver[:3] != b"cc=": + data = ver + data + ver = b"cc=0" + + # Get the version number out of the cc=N + ver = ver.split(b"=", 1)[-1].decode("ascii") + + # Dispatch to the actual load method for the given version + try: + return getattr(self, "_loads_v{}".format(ver))(request, data) + + except AttributeError: + # This is a version we don't have a loads function for, so we'll + # just treat it as a miss and return None + return + + def prepare_response(self, request, cached): + """Verify our vary headers match and construct a real urllib3 + HTTPResponse object. + """ + # Special case the '*' Vary value as it means we cannot actually + # determine if the cached response is suitable for this request. + # This case is also handled in the controller code when creating + # a cache entry, but is left here for backwards compatibility. + if "*" in cached.get("vary", {}): + return + + # Ensure that the Vary headers for the cached response match our + # request + for header, value in cached.get("vary", {}).items(): + if request.headers.get(header, None) != value: + return + + body_raw = cached["response"].pop("body") + + headers = CaseInsensitiveDict(data=cached["response"]["headers"]) + if headers.get("transfer-encoding", "") == "chunked": + headers.pop("transfer-encoding") + + cached["response"]["headers"] = headers + + try: + body = io.BytesIO(body_raw) + except TypeError: + # This can happen if cachecontrol serialized to v1 format (pickle) + # using Python 2. A Python 2 str(byte string) will be unpickled as + # a Python 3 str (unicode string), which will cause the above to + # fail with: + # + # TypeError: 'str' does not support the buffer interface + body = io.BytesIO(body_raw.encode("utf8")) + + return HTTPResponse(body=body, preload_content=False, **cached["response"]) + + def _loads_v0(self, request, data): + # The original legacy cache data. This doesn't contain enough + # information to construct everything we need, so we'll treat this as + # a miss. + return + + def _loads_v1(self, request, data): + try: + cached = pickle.loads(data) + except ValueError: + return + + return self.prepare_response(request, cached) + + def _loads_v2(self, request, data): + try: + cached = json.loads(zlib.decompress(data).decode("utf8")) + except (ValueError, zlib.error): + return + + # We need to decode the items that we've base64 encoded + cached["response"]["body"] = _b64_decode_bytes(cached["response"]["body"]) + cached["response"]["headers"] = dict( + (_b64_decode_str(k), _b64_decode_str(v)) + for k, v in cached["response"]["headers"].items() + ) + cached["response"]["reason"] = _b64_decode_str(cached["response"]["reason"]) + cached["vary"] = dict( + (_b64_decode_str(k), _b64_decode_str(v) if v is not None else v) + for k, v in cached["vary"].items() + ) + + return self.prepare_response(request, cached) + + def _loads_v3(self, request, data): + # Due to Python 2 encoding issues, it's impossible to know for sure + # exactly how to load v3 entries, thus we'll treat these as a miss so + # that they get rewritten out as v4 entries. + return + + def _loads_v4(self, request, data): + try: + cached = msgpack.loads(data, raw=False) + except ValueError: + return + + return self.prepare_response(request, cached) diff --git a/cres/venv/lib/python3.8/site-packages/cachecontrol/wrapper.py b/cres/venv/lib/python3.8/site-packages/cachecontrol/wrapper.py new file mode 100644 index 000000000..d8e6fc6a9 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/cachecontrol/wrapper.py @@ -0,0 +1,29 @@ +from .adapter import CacheControlAdapter +from .cache import DictCache + + +def CacheControl( + sess, + cache=None, + cache_etags=True, + serializer=None, + heuristic=None, + controller_class=None, + adapter_class=None, + cacheable_methods=None, +): + + cache = DictCache() if cache is None else cache + adapter_class = adapter_class or CacheControlAdapter + adapter = adapter_class( + cache, + cache_etags=cache_etags, + serializer=serializer, + heuristic=heuristic, + controller_class=controller_class, + cacheable_methods=cacheable_methods, + ) + sess.mount("http://", adapter) + sess.mount("https://", adapter) + + return sess diff --git a/cres/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/AUTHORS.txt b/cres/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/AUTHORS.txt new file mode 100644 index 000000000..72c87d7d3 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/AUTHORS.txt @@ -0,0 +1,562 @@ +A_Rog +Aakanksha Agrawal <11389424+rasponic@users.noreply.github.com> +Abhinav Sagar <40603139+abhinavsagar@users.noreply.github.com> +ABHYUDAY PRATAP SINGH +abs51295 +AceGentile +Adam Chainz +Adam Tse +Adam Tse +Adam Wentz +admin +Adrien Morison +ahayrapetyan +Ahilya +AinsworthK +Akash Srivastava +Alan Yee +Albert Tugushev +Albert-Guan +albertg +Aleks Bunin +Alethea Flowers +Alex Gaynor +Alex Grönholm +Alex Loosley +Alex Morega +Alex Stachowiak +Alexander Shtyrov +Alexandre Conrad +Alexey Popravka +Alexey Popravka +Alli +Ami Fischman +Ananya Maiti +Anatoly Techtonik +Anders Kaseorg +Andreas Lutro +Andrei Geacar +Andrew Gaul +Andrey Bulgakov +Andrés Delfino <34587441+andresdelfino@users.noreply.github.com> +Andrés Delfino +Andy Freeland +Andy Freeland +Andy Kluger +Ani Hayrapetyan +Aniruddha Basak +Anish Tambe +Anrs Hu +Anthony Sottile +Antoine Musso +Anton Ovchinnikov +Anton Patrushev +Antonio Alvarado Hernandez +Antony Lee +Antti Kaihola +Anubhav Patel +Anuj Godase +AQNOUCH Mohammed +AraHaan +Arindam Choudhury +Armin Ronacher +Artem +Ashley Manton +Ashwin Ramaswami +atse +Atsushi Odagiri +Avner Cohen +Baptiste Mispelon +Barney Gale +barneygale +Bartek Ogryczak +Bastian Venthur +Ben Darnell +Ben Hoyt +Ben Rosser +Bence Nagy +Benjamin Peterson +Benjamin VanEvery +Benoit Pierre +Berker Peksag +Bernardo B. Marques +Bernhard M. Wiedemann +Bertil Hatt +Bogdan Opanchuk +BorisZZZ +Brad Erickson +Bradley Ayers +Brandon L. Reiss +Brandt Bucher +Brett Randall +Brian Cristante <33549821+brcrista@users.noreply.github.com> +Brian Cristante +Brian Rosner +BrownTruck +Bruno Oliveira +Bruno Renié +Bstrdsmkr +Buck Golemon +burrows +Bussonnier Matthias +c22 +Caleb Martinez +Calvin Smith +Carl Meyer +Carlos Liam +Carol Willing +Carter Thayer +Cass +Chandrasekhar Atina +Chih-Hsuan Yen +Chih-Hsuan Yen +Chris Brinker +Chris Hunt +Chris Jerdonek +Chris McDonough +Chris Wolfe +Christian Heimes +Christian Oudard +Christopher Hunt +Christopher Snyder +Clark Boylan +Clay McClure +Cody +Cody Soyland +Colin Watson +Connor Osborn +Cooper Lees +Cooper Ry Lees +Cory Benfield +Cory Wright +Craig Kerstiens +Cristian Sorinel +Curtis Doty +cytolentino +Damian Quiroga +Dan Black +Dan Savilonis +Dan Sully +daniel +Daniel Collins +Daniel Hahler +Daniel Holth +Daniel Jost +Daniel Shaulov +Daniele Esposti +Daniele Procida +Danny Hermes +Dav Clark +Dave Abrahams +Dave Jones +David Aguilar +David Black +David Bordeynik +David Bordeynik +David Caro +David Evans +David Linke +David Pursehouse +David Tucker +David Wales +Davidovich +derwolfe +Desetude +Diego Caraballo +DiegoCaraballo +Dmitry Gladkov +Domen Kožar +Donald Stufft +Dongweiming +Douglas Thor +DrFeathers +Dustin Ingram +Dwayne Bailey +Ed Morley <501702+edmorley@users.noreply.github.com> +Ed Morley +Eitan Adler +ekristina +elainechan +Eli Schwartz +Eli Schwartz +Emil Burzo +Emil Styrke +Endoh Takanao +enoch +Erdinc Mutlu +Eric Gillingham +Eric Hanchrow +Eric Hopper +Erik M. Bray +Erik Rose +Ernest W Durbin III +Ernest W. Durbin III +Erwin Janssen +Eugene Vereshchagin +everdimension +Felix Yan +fiber-space +Filip Kokosiński +Florian Briand +Florian Rathgeber +Francesco +Francesco Montesano +Frost Ming +Gabriel Curio +Gabriel de Perthuis +Garry Polley +gdanielson +Geoffrey Lehée +Geoffrey Sneddon +George Song +Georgi Valkov +Giftlin Rajaiah +gizmoguy1 +gkdoc <40815324+gkdoc@users.noreply.github.com> +Gopinath M <31352222+mgopi1990@users.noreply.github.com> +GOTO Hayato <3532528+gh640@users.noreply.github.com> +gpiks +Guilherme Espada +Guy Rozendorn +gzpan123 +Hanjun Kim +Hari Charan +Harsh Vardhan +Herbert Pfennig +Hsiaoming Yang +Hugo +Hugo Lopes Tavares +Hugo van Kemenade +hugovk +Hynek Schlawack +Ian Bicking +Ian Cordasco +Ian Lee +Ian Stapleton Cordasco +Ian Wienand +Ian Wienand +Igor Kuzmitshov +Igor Sobreira +Ilya Baryshev +INADA Naoki +Ionel Cristian Mărieș +Ionel Maries Cristian +Ivan Pozdeev +Jacob Kim +jakirkham +Jakub Stasiak +Jakub Vysoky +Jakub Wilk +James Cleveland +James Cleveland +James Firth +James Polley +Jan Pokorný +Jannis Leidel +jarondl +Jason R. Coombs +Jay Graves +Jean-Christophe Fillion-Robin +Jeff Barber +Jeff Dairiki +Jelmer Vernooij +jenix21 +Jeremy Stanley +Jeremy Zafran +Jiashuo Li +Jim Garrison +Jivan Amara +John Paton +John-Scott Atlakson +johnthagen +johnthagen +Jon Banafato +Jon Dufresne +Jon Parise +Jonas Nockert +Jonathan Herbert +Joost Molenaar +Jorge Niedbalski +Joseph Long +Josh Bronson +Josh Hansen +Josh Schneier +Juanjo Bazán +Julian Berman +Julian Gethmann +Julien Demoor +jwg4 +Jyrki Pulliainen +Kai Chen +Kamal Bin Mustafa +kaustav haldar +keanemind +Keith Maxwell +Kelsey Hightower +Kenneth Belitzky +Kenneth Reitz +Kenneth Reitz +Kevin Burke +Kevin Carter +Kevin Frommelt +Kevin R Patterson +Kexuan Sun +Kit Randel +kpinc +Krishna Oza +Kumar McMillan +Kyle Persohn +lakshmanaram +Laszlo Kiss-Kollar +Laurent Bristiel +Laurie Opperman +Leon Sasson +Lev Givon +Lincoln de Sousa +Lipis +Loren Carvalho +Lucas Cimon +Ludovic Gasc +Luke Macken +Luo Jiebin +luojiebin +luz.paz +László Kiss Kollár +László Kiss Kollár +Marc Abramowitz +Marc Tamlyn +Marcus Smith +Mariatta +Mark Kohler +Mark Williams +Mark Williams +Markus Hametner +Masaki +Masklinn +Matej Stuchlik +Mathew Jennings +Mathieu Bridon +Matt Good +Matt Maker +Matt Robenolt +matthew +Matthew Einhorn +Matthew Gilliard +Matthew Iversen +Matthew Trumbell +Matthew Willson +Matthias Bussonnier +mattip +Maxim Kurnikov +Maxime Rouyrre +mayeut +mbaluna <44498973+mbaluna@users.noreply.github.com> +mdebi <17590103+mdebi@users.noreply.github.com> +memoselyk +Michael +Michael Aquilina +Michael E. Karpeles +Michael Klich +Michael Williamson +michaelpacer +Mickaël Schoentgen +Miguel Araujo Perez +Mihir Singh +Mike +Mike Hendricks +Min RK +MinRK +Miro Hrončok +Monica Baluna +montefra +Monty Taylor +Nate Coraor +Nathaniel J. Smith +Nehal J Wani +Neil Botelho +Nick Coghlan +Nick Stenning +Nick Timkovich +Nicolas Bock +Nikhil Benesch +Nitesh Sharma +Nowell Strite +NtaleGrey +nvdv +Ofekmeister +ofrinevo +Oliver Jeeves +Oliver Tonnhofer +Olivier Girardot +Olivier Grisel +Ollie Rutherfurd +OMOTO Kenji +Omry Yadan +Oren Held +Oscar Benjamin +Oz N Tiram +Pachwenko <32424503+Pachwenko@users.noreply.github.com> +Patrick Dubroy +Patrick Jenkins +Patrick Lawson +patricktokeeffe +Patrik Kopkan +Paul Kehrer +Paul Moore +Paul Nasrat +Paul Oswald +Paul van der Linden +Paulus Schoutsen +Pavithra Eswaramoorthy <33131404+QueenCoffee@users.noreply.github.com> +Pawel Jasinski +Pekka Klärck +Peter Lisák +Peter Waller +petr-tik +Phaneendra Chiruvella +Phil Freo +Phil Pennock +Phil Whelan +Philip Jägenstedt +Philip Molloy +Philippe Ombredanne +Pi Delport +Pierre-Yves Rofes +pip +Prabakaran Kumaresshan +Prabhjyotsing Surjit Singh Sodhi +Prabhu Marappan +Pradyun Gedam +Pratik Mallya +Preet Thakkar +Preston Holmes +Przemek Wrzos +Pulkit Goyal <7895pulkit@gmail.com> +Qiangning Hong +Quentin Pradet +R. David Murray +Rafael Caricio +Ralf Schmitt +Razzi Abuissa +rdb +Remi Rampin +Remi Rampin +Rene Dudfield +Riccardo Magliocchetti +Richard Jones +RobberPhex +Robert Collins +Robert McGibbon +Robert T. McGibbon +robin elisha robinson +Roey Berman +Rohan Jain +Rohan Jain +Rohan Jain +Roman Bogorodskiy +Romuald Brunet +Ronny Pfannschmidt +Rory McCann +Ross Brattain +Roy Wellington Ⅳ +Roy Wellington Ⅳ +Ryan Wooden +ryneeverett +Sachi King +Salvatore Rinchiera +Savio Jomton +schlamar +Scott Kitterman +Sean +seanj +Sebastian Jordan +Sebastian Schaetz +Segev Finer +SeongSoo Cho +Sergey Vasilyev +Seth Woodworth +Shlomi Fish +Shovan Maity +Simeon Visser +Simon Cross +Simon Pichugin +sinoroc +Sorin Sbarnea +Stavros Korokithakis +Stefan Scherfke +Stephan Erb +stepshal +Steve (Gadget) Barnes +Steve Barnes +Steve Dower +Steve Kowalik +Steven Myint +stonebig +Stéphane Bidoul (ACSONE) +Stéphane Bidoul +Stéphane Klein +Sumana Harihareswara +Sviatoslav Sydorenko +Sviatoslav Sydorenko +Swat009 +Takayuki SHIMIZUKAWA +tbeswick +Thijs Triemstra +Thomas Fenzl +Thomas Grainger +Thomas Guettler +Thomas Johansson +Thomas Kluyver +Thomas Smith +Tim D. Smith +Tim Gates +Tim Harder +Tim Heap +tim smith +tinruufu +Tom Forbes +Tom Freudenheim +Tom V +Tomas Orsava +Tomer Chachamu +Tony Beswick +Tony Zhaocheng Tan +TonyBeswick +toonarmycaptain +Toshio Kuratomi +Travis Swicegood +Tzu-ping Chung +Valentin Haenel +Victor Stinner +victorvpaulo +Viktor Szépe +Ville Skyttä +Vinay Sajip +Vincent Philippon +Vinicyus Macedo <7549205+vinicyusmacedo@users.noreply.github.com> +Vitaly Babiy +Vladimir Rutsky +W. Trevor King +Wil Tan +Wilfred Hughes +William ML Leslie +William T Olson +Wilson Mo +wim glenn +Wolfgang Maier +Xavier Fernandez +Xavier Fernandez +xoviat +xtreak +YAMAMOTO Takashi +Yen Chi Hsuan +Yeray Diaz Diaz +Yoval P +Yu Jian +Yuan Jing Vincent Yan +Zearin +Zearin +Zhiping Deng +Zvezdan Petkovic +Łukasz Langa +Семён Марьясин diff --git a/cres/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/INSTALLER b/cres/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/INSTALLER new file mode 100644 index 000000000..a1b589e38 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/cres/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/LICENSE.txt b/cres/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/LICENSE.txt new file mode 100644 index 000000000..737fec5c5 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/LICENSE.txt @@ -0,0 +1,20 @@ +Copyright (c) 2008-2019 The pip developers (see AUTHORS.txt file) + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/cres/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/METADATA b/cres/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/METADATA new file mode 100644 index 000000000..e897b3d83 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/METADATA @@ -0,0 +1,74 @@ +Metadata-Version: 2.1 +Name: certifi +Version: 2019.11.28 +Summary: Python package for providing Mozilla's CA Bundle. +Home-page: https://certifi.io/ +Author: Kenneth Reitz +Author-email: me@kennethreitz.com +License: MPL-2.0 +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0) +Classifier: Natural Language :: English +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 + +Certifi: Python SSL Certificates +================================ + +`Certifi`_ is a carefully curated collection of Root Certificates for +validating the trustworthiness of SSL certificates while verifying the identity +of TLS hosts. It has been extracted from the `Requests`_ project. + +Installation +------------ + +``certifi`` is available on PyPI. Simply install it with ``pip``:: + + $ pip install certifi + +Usage +----- + +To reference the installed certificate authority (CA) bundle, you can use the +built-in function:: + + >>> import certifi + + >>> certifi.where() + '/usr/local/lib/python2.7/site-packages/certifi/cacert.pem' + +Or from the command line:: + + $ python -m certifi + /usr/local/lib/python2.7/site-packages/certifi/cacert.pem + +Enjoy! + +1024-bit Root Certificates +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Browsers and certificate authorities have concluded that 1024-bit keys are +unacceptably weak for certificates, particularly root certificates. For this +reason, Mozilla has removed any weak (i.e. 1024-bit key) certificate from its +bundle, replacing it with an equivalent strong (i.e. 2048-bit or greater key) +certificate from the same CA. Because Mozilla removed these certificates from +its bundle, ``certifi`` removed them as well. + +In previous versions, ``certifi`` provided the ``certifi.old_where()`` function +to intentionally re-add the 1024-bit roots back into your bundle. This was not +recommended in production and therefore was removed at the end of 2018. + +.. _`Certifi`: https://certifi.io/en/latest/ +.. _`Requests`: http://docs.python-requests.org/en/latest/ + + diff --git a/cres/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/RECORD b/cres/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/RECORD new file mode 100644 index 000000000..538c144a4 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/RECORD @@ -0,0 +1,17 @@ +certifi/__init__.py,sha256=JVwzDhkMttyVVtfNDrU_i0v2a-WmtEBXq0Z8oz4Ghzk,52 +certifi/__main__.py,sha256=FiOYt1Fltst7wk9DRa6GCoBr8qBUxlNQu_MKJf04E6s,41 +certifi/cacert.pem,sha256=cyvv5Jx1gHACNEj2GaOrsIj0Tk8FmSvHR42uhzvlatg,281457 +certifi/core.py,sha256=u_450edAVoiZrgqi6k3Sekcvs-B1zD_hTeE6UJ2OcQ4,225 +certifi-2019.11.28.dist-info/AUTHORS.txt,sha256=RtqU9KfonVGhI48DAA4-yTOBUhBtQTjFhaDzHoyh7uU,21518 +certifi-2019.11.28.dist-info/LICENSE.txt,sha256=W6Ifuwlk-TatfRU2LR7W1JMcyMj5_y1NkRkOEJvnRDE,1090 +certifi-2019.11.28.dist-info/METADATA,sha256=K6ioZZT9N0bRETHmncjK-UJKAFIVF26h1F31dfDaV5k,2523 +certifi-2019.11.28.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110 +certifi-2019.11.28.dist-info/top_level.txt,sha256=KMu4vUCfsjLrkPbSNdgdekS-pVJzBAJFO__nI8NF6-U,8 +certifi-2019.11.28.dist-info/RECORD,, +certifi-2019.11.28.dist-info/__pycache__,, +certifi/__init__.cpython-38.pyc,, +certifi-2019.11.28.virtualenv,, +certifi/__main__.cpython-38.pyc,, +certifi/core.cpython-38.pyc,, +certifi-2019.11.28.dist-info/INSTALLER,, +certifi/__pycache__,, \ No newline at end of file diff --git a/cres/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/WHEEL b/cres/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/WHEEL new file mode 100644 index 000000000..ef99c6cf3 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.34.2) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/cres/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/top_level.txt b/cres/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/top_level.txt new file mode 100644 index 000000000..963eac530 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/certifi-2019.11.28.dist-info/top_level.txt @@ -0,0 +1 @@ +certifi diff --git a/cres/venv/lib/python3.8/site-packages/certifi-2019.11.28.virtualenv b/cres/venv/lib/python3.8/site-packages/certifi-2019.11.28.virtualenv new file mode 100644 index 000000000..e69de29bb diff --git a/cres/venv/lib/python3.8/site-packages/certifi/__init__.py b/cres/venv/lib/python3.8/site-packages/certifi/__init__.py new file mode 100644 index 000000000..0d59a0563 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/certifi/__init__.py @@ -0,0 +1,3 @@ +from .core import where + +__version__ = "2019.11.28" diff --git a/cres/venv/lib/python3.8/site-packages/certifi/__main__.py b/cres/venv/lib/python3.8/site-packages/certifi/__main__.py new file mode 100644 index 000000000..5f1da0dd0 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/certifi/__main__.py @@ -0,0 +1,2 @@ +from certifi import where +print(where()) diff --git a/cres/venv/lib/python3.8/site-packages/certifi/__pycache__/__init__.cpython-38.pyc b/cres/venv/lib/python3.8/site-packages/certifi/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a7612844c18aa4661bf4f579a961598474a6a3cd GIT binary patch literal 269 zcmYjLK~BRk5VX@Ep+awbB8Oy2%b`dJ@dAW|xa3gFwYQBSvBTOVDnH`JdvZgZ_yQ*! zxG>VrYIbK=^RQUVS;YJ5V{;Mv=Oq3kiQ*=fKZ~T9<_&9k#W~YSmFU?$%hE3%R~a9V zh8hW9=gaf*vM9@9xxUS2RjM2zO>f2%A$lZloE74YQ5t8z^!*IAYY}$NZ6(1SxkpsN z!!Qha_a|~=1MW$Nc%1tnt(K%cC_)cC+8!FSh3*h)XII43v}z@o_z)P`_?~Qt ziCN)?7KA|`iiAvdfK)@!(Gw#r7|_IpdDmcu1d(Vn6@;3C#H`KKNTx<1uWNk$_=|VdJY1+E|<%s z*%pba9n8#Thy(|#B{vdz4Oq5-dcjIHWzEVJx*nxx%qj;-!^H!i;e(wtCbR)uU)x(2 wU|`q{7$6Wj^vof~*l+t;Cbh^i)BVflaHDV!26)j9&bJ%C=r*-!5*!TtU-cP>MgRZ+ literal 0 HcmV?d00001 diff --git a/cres/venv/lib/python3.8/site-packages/certifi/cacert.pem b/cres/venv/lib/python3.8/site-packages/certifi/cacert.pem new file mode 100644 index 000000000..a4758ef3a --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/certifi/cacert.pem @@ -0,0 +1,4602 @@ + +# 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=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----- +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 +-----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----- +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 +-----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=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\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) +# Subject: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) +# Label: "NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny" +# 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----- +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 +-----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\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi +# Subject: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. 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----- +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 +-----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----- + +# Issuer: CN=Entrust Root Certification Authority - G4 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2015 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - G4 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2015 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - G4" +# Serial: 289383649854506086828220374796556676440 +# MD5 Fingerprint: 89:53:f1:83:23:b7:7c:8e:05:f1:8c:71:38:4e:1f:88 +# SHA1 Fingerprint: 14:88:4e:86:26:37:b0:26:af:59:62:5c:40:77:ec:35:29:ba:96:01 +# SHA256 Fingerprint: db:35:17:d1:f6:73:2a:2d:5a:b9:7c:53:3e:c7:07:79:ee:32:70:a6:2f:b4:ac:42:38:37:24:60:e6:f0:1e:88 +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAw +gb4xCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQL +Ex9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykg +MjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAw +BgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0 +MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1 +c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJ +bmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3Qg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3DumSXbcr3DbVZwbPLqGgZ +2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV3imz/f3E +T+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j +5pds8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAM +C1rlLAHGVK/XqsEQe9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73T +DtTUXm6Hnmo9RR3RXRv06QqsYJn7ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNX +wbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5XxNMhIWNlUpEbsZmOeX7m640A +2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV7rtNOzK+mndm +nqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8 +dWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwl +N4y6mACXi0mWHv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNj +c0kCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9nMA0GCSqGSIb3DQEBCwUAA4ICAQAS +5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4QjbRaZIxowLByQzTS +Gwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht7LGr +hFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/ +B7NTeLUKYvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uI +AeV8KEsD+UmDfLJ/fOPtjqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbw +H5Lk6rWS02FREAutp9lfx1/cH6NcjKF+m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+ +b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKWRGhXxNUzzxkvFMSUHHuk +2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjAJOgc47Ol +IQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk +5F6G+TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuY +n/PIjhs4ViFqUZPTkcpG2om3PVODLAgfi49T3f+sHw== +-----END CERTIFICATE----- diff --git a/cres/venv/lib/python3.8/site-packages/certifi/core.py b/cres/venv/lib/python3.8/site-packages/certifi/core.py new file mode 100644 index 000000000..53404e133 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/certifi/core.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- + +""" +certifi.py +~~~~~~~~~~ + +This module returns the installation location of cacert.pem. +""" +import os + + +def where(): + f = os.path.dirname(__file__) + + return '/etc/ssl/certs/ca-certificates.crt' diff --git a/cres/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/AUTHORS.txt b/cres/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/AUTHORS.txt new file mode 100644 index 000000000..72c87d7d3 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/AUTHORS.txt @@ -0,0 +1,562 @@ +A_Rog +Aakanksha Agrawal <11389424+rasponic@users.noreply.github.com> +Abhinav Sagar <40603139+abhinavsagar@users.noreply.github.com> +ABHYUDAY PRATAP SINGH +abs51295 +AceGentile +Adam Chainz +Adam Tse +Adam Tse +Adam Wentz +admin +Adrien Morison +ahayrapetyan +Ahilya +AinsworthK +Akash Srivastava +Alan Yee +Albert Tugushev +Albert-Guan +albertg +Aleks Bunin +Alethea Flowers +Alex Gaynor +Alex Grönholm +Alex Loosley +Alex Morega +Alex Stachowiak +Alexander Shtyrov +Alexandre Conrad +Alexey Popravka +Alexey Popravka +Alli +Ami Fischman +Ananya Maiti +Anatoly Techtonik +Anders Kaseorg +Andreas Lutro +Andrei Geacar +Andrew Gaul +Andrey Bulgakov +Andrés Delfino <34587441+andresdelfino@users.noreply.github.com> +Andrés Delfino +Andy Freeland +Andy Freeland +Andy Kluger +Ani Hayrapetyan +Aniruddha Basak +Anish Tambe +Anrs Hu +Anthony Sottile +Antoine Musso +Anton Ovchinnikov +Anton Patrushev +Antonio Alvarado Hernandez +Antony Lee +Antti Kaihola +Anubhav Patel +Anuj Godase +AQNOUCH Mohammed +AraHaan +Arindam Choudhury +Armin Ronacher +Artem +Ashley Manton +Ashwin Ramaswami +atse +Atsushi Odagiri +Avner Cohen +Baptiste Mispelon +Barney Gale +barneygale +Bartek Ogryczak +Bastian Venthur +Ben Darnell +Ben Hoyt +Ben Rosser +Bence Nagy +Benjamin Peterson +Benjamin VanEvery +Benoit Pierre +Berker Peksag +Bernardo B. Marques +Bernhard M. Wiedemann +Bertil Hatt +Bogdan Opanchuk +BorisZZZ +Brad Erickson +Bradley Ayers +Brandon L. Reiss +Brandt Bucher +Brett Randall +Brian Cristante <33549821+brcrista@users.noreply.github.com> +Brian Cristante +Brian Rosner +BrownTruck +Bruno Oliveira +Bruno Renié +Bstrdsmkr +Buck Golemon +burrows +Bussonnier Matthias +c22 +Caleb Martinez +Calvin Smith +Carl Meyer +Carlos Liam +Carol Willing +Carter Thayer +Cass +Chandrasekhar Atina +Chih-Hsuan Yen +Chih-Hsuan Yen +Chris Brinker +Chris Hunt +Chris Jerdonek +Chris McDonough +Chris Wolfe +Christian Heimes +Christian Oudard +Christopher Hunt +Christopher Snyder +Clark Boylan +Clay McClure +Cody +Cody Soyland +Colin Watson +Connor Osborn +Cooper Lees +Cooper Ry Lees +Cory Benfield +Cory Wright +Craig Kerstiens +Cristian Sorinel +Curtis Doty +cytolentino +Damian Quiroga +Dan Black +Dan Savilonis +Dan Sully +daniel +Daniel Collins +Daniel Hahler +Daniel Holth +Daniel Jost +Daniel Shaulov +Daniele Esposti +Daniele Procida +Danny Hermes +Dav Clark +Dave Abrahams +Dave Jones +David Aguilar +David Black +David Bordeynik +David Bordeynik +David Caro +David Evans +David Linke +David Pursehouse +David Tucker +David Wales +Davidovich +derwolfe +Desetude +Diego Caraballo +DiegoCaraballo +Dmitry Gladkov +Domen Kožar +Donald Stufft +Dongweiming +Douglas Thor +DrFeathers +Dustin Ingram +Dwayne Bailey +Ed Morley <501702+edmorley@users.noreply.github.com> +Ed Morley +Eitan Adler +ekristina +elainechan +Eli Schwartz +Eli Schwartz +Emil Burzo +Emil Styrke +Endoh Takanao +enoch +Erdinc Mutlu +Eric Gillingham +Eric Hanchrow +Eric Hopper +Erik M. Bray +Erik Rose +Ernest W Durbin III +Ernest W. Durbin III +Erwin Janssen +Eugene Vereshchagin +everdimension +Felix Yan +fiber-space +Filip Kokosiński +Florian Briand +Florian Rathgeber +Francesco +Francesco Montesano +Frost Ming +Gabriel Curio +Gabriel de Perthuis +Garry Polley +gdanielson +Geoffrey Lehée +Geoffrey Sneddon +George Song +Georgi Valkov +Giftlin Rajaiah +gizmoguy1 +gkdoc <40815324+gkdoc@users.noreply.github.com> +Gopinath M <31352222+mgopi1990@users.noreply.github.com> +GOTO Hayato <3532528+gh640@users.noreply.github.com> +gpiks +Guilherme Espada +Guy Rozendorn +gzpan123 +Hanjun Kim +Hari Charan +Harsh Vardhan +Herbert Pfennig +Hsiaoming Yang +Hugo +Hugo Lopes Tavares +Hugo van Kemenade +hugovk +Hynek Schlawack +Ian Bicking +Ian Cordasco +Ian Lee +Ian Stapleton Cordasco +Ian Wienand +Ian Wienand +Igor Kuzmitshov +Igor Sobreira +Ilya Baryshev +INADA Naoki +Ionel Cristian Mărieș +Ionel Maries Cristian +Ivan Pozdeev +Jacob Kim +jakirkham +Jakub Stasiak +Jakub Vysoky +Jakub Wilk +James Cleveland +James Cleveland +James Firth +James Polley +Jan Pokorný +Jannis Leidel +jarondl +Jason R. Coombs +Jay Graves +Jean-Christophe Fillion-Robin +Jeff Barber +Jeff Dairiki +Jelmer Vernooij +jenix21 +Jeremy Stanley +Jeremy Zafran +Jiashuo Li +Jim Garrison +Jivan Amara +John Paton +John-Scott Atlakson +johnthagen +johnthagen +Jon Banafato +Jon Dufresne +Jon Parise +Jonas Nockert +Jonathan Herbert +Joost Molenaar +Jorge Niedbalski +Joseph Long +Josh Bronson +Josh Hansen +Josh Schneier +Juanjo Bazán +Julian Berman +Julian Gethmann +Julien Demoor +jwg4 +Jyrki Pulliainen +Kai Chen +Kamal Bin Mustafa +kaustav haldar +keanemind +Keith Maxwell +Kelsey Hightower +Kenneth Belitzky +Kenneth Reitz +Kenneth Reitz +Kevin Burke +Kevin Carter +Kevin Frommelt +Kevin R Patterson +Kexuan Sun +Kit Randel +kpinc +Krishna Oza +Kumar McMillan +Kyle Persohn +lakshmanaram +Laszlo Kiss-Kollar +Laurent Bristiel +Laurie Opperman +Leon Sasson +Lev Givon +Lincoln de Sousa +Lipis +Loren Carvalho +Lucas Cimon +Ludovic Gasc +Luke Macken +Luo Jiebin +luojiebin +luz.paz +László Kiss Kollár +László Kiss Kollár +Marc Abramowitz +Marc Tamlyn +Marcus Smith +Mariatta +Mark Kohler +Mark Williams +Mark Williams +Markus Hametner +Masaki +Masklinn +Matej Stuchlik +Mathew Jennings +Mathieu Bridon +Matt Good +Matt Maker +Matt Robenolt +matthew +Matthew Einhorn +Matthew Gilliard +Matthew Iversen +Matthew Trumbell +Matthew Willson +Matthias Bussonnier +mattip +Maxim Kurnikov +Maxime Rouyrre +mayeut +mbaluna <44498973+mbaluna@users.noreply.github.com> +mdebi <17590103+mdebi@users.noreply.github.com> +memoselyk +Michael +Michael Aquilina +Michael E. Karpeles +Michael Klich +Michael Williamson +michaelpacer +Mickaël Schoentgen +Miguel Araujo Perez +Mihir Singh +Mike +Mike Hendricks +Min RK +MinRK +Miro Hrončok +Monica Baluna +montefra +Monty Taylor +Nate Coraor +Nathaniel J. Smith +Nehal J Wani +Neil Botelho +Nick Coghlan +Nick Stenning +Nick Timkovich +Nicolas Bock +Nikhil Benesch +Nitesh Sharma +Nowell Strite +NtaleGrey +nvdv +Ofekmeister +ofrinevo +Oliver Jeeves +Oliver Tonnhofer +Olivier Girardot +Olivier Grisel +Ollie Rutherfurd +OMOTO Kenji +Omry Yadan +Oren Held +Oscar Benjamin +Oz N Tiram +Pachwenko <32424503+Pachwenko@users.noreply.github.com> +Patrick Dubroy +Patrick Jenkins +Patrick Lawson +patricktokeeffe +Patrik Kopkan +Paul Kehrer +Paul Moore +Paul Nasrat +Paul Oswald +Paul van der Linden +Paulus Schoutsen +Pavithra Eswaramoorthy <33131404+QueenCoffee@users.noreply.github.com> +Pawel Jasinski +Pekka Klärck +Peter Lisák +Peter Waller +petr-tik +Phaneendra Chiruvella +Phil Freo +Phil Pennock +Phil Whelan +Philip Jägenstedt +Philip Molloy +Philippe Ombredanne +Pi Delport +Pierre-Yves Rofes +pip +Prabakaran Kumaresshan +Prabhjyotsing Surjit Singh Sodhi +Prabhu Marappan +Pradyun Gedam +Pratik Mallya +Preet Thakkar +Preston Holmes +Przemek Wrzos +Pulkit Goyal <7895pulkit@gmail.com> +Qiangning Hong +Quentin Pradet +R. David Murray +Rafael Caricio +Ralf Schmitt +Razzi Abuissa +rdb +Remi Rampin +Remi Rampin +Rene Dudfield +Riccardo Magliocchetti +Richard Jones +RobberPhex +Robert Collins +Robert McGibbon +Robert T. McGibbon +robin elisha robinson +Roey Berman +Rohan Jain +Rohan Jain +Rohan Jain +Roman Bogorodskiy +Romuald Brunet +Ronny Pfannschmidt +Rory McCann +Ross Brattain +Roy Wellington Ⅳ +Roy Wellington Ⅳ +Ryan Wooden +ryneeverett +Sachi King +Salvatore Rinchiera +Savio Jomton +schlamar +Scott Kitterman +Sean +seanj +Sebastian Jordan +Sebastian Schaetz +Segev Finer +SeongSoo Cho +Sergey Vasilyev +Seth Woodworth +Shlomi Fish +Shovan Maity +Simeon Visser +Simon Cross +Simon Pichugin +sinoroc +Sorin Sbarnea +Stavros Korokithakis +Stefan Scherfke +Stephan Erb +stepshal +Steve (Gadget) Barnes +Steve Barnes +Steve Dower +Steve Kowalik +Steven Myint +stonebig +Stéphane Bidoul (ACSONE) +Stéphane Bidoul +Stéphane Klein +Sumana Harihareswara +Sviatoslav Sydorenko +Sviatoslav Sydorenko +Swat009 +Takayuki SHIMIZUKAWA +tbeswick +Thijs Triemstra +Thomas Fenzl +Thomas Grainger +Thomas Guettler +Thomas Johansson +Thomas Kluyver +Thomas Smith +Tim D. Smith +Tim Gates +Tim Harder +Tim Heap +tim smith +tinruufu +Tom Forbes +Tom Freudenheim +Tom V +Tomas Orsava +Tomer Chachamu +Tony Beswick +Tony Zhaocheng Tan +TonyBeswick +toonarmycaptain +Toshio Kuratomi +Travis Swicegood +Tzu-ping Chung +Valentin Haenel +Victor Stinner +victorvpaulo +Viktor Szépe +Ville Skyttä +Vinay Sajip +Vincent Philippon +Vinicyus Macedo <7549205+vinicyusmacedo@users.noreply.github.com> +Vitaly Babiy +Vladimir Rutsky +W. Trevor King +Wil Tan +Wilfred Hughes +William ML Leslie +William T Olson +Wilson Mo +wim glenn +Wolfgang Maier +Xavier Fernandez +Xavier Fernandez +xoviat +xtreak +YAMAMOTO Takashi +Yen Chi Hsuan +Yeray Diaz Diaz +Yoval P +Yu Jian +Yuan Jing Vincent Yan +Zearin +Zearin +Zhiping Deng +Zvezdan Petkovic +Łukasz Langa +Семён Марьясин diff --git a/cres/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/INSTALLER b/cres/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/INSTALLER new file mode 100644 index 000000000..a1b589e38 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/cres/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/LICENSE.txt b/cres/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/LICENSE.txt new file mode 100644 index 000000000..737fec5c5 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/LICENSE.txt @@ -0,0 +1,20 @@ +Copyright (c) 2008-2019 The pip developers (see AUTHORS.txt file) + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/cres/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/METADATA b/cres/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/METADATA new file mode 100644 index 000000000..f1f13a855 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/METADATA @@ -0,0 +1,98 @@ +Metadata-Version: 2.1 +Name: chardet +Version: 3.0.4 +Summary: Universal encoding detector for Python 2 and 3 +Home-page: https://github.com/chardet/chardet +Author: Mark Pilgrim +Author-email: mark@diveintomark.org +Maintainer: Daniel Blanchard +Maintainer-email: dan.blanchard@gmail.com +License: LGPL +Keywords: encoding,i18n,xml +Platform: UNKNOWN +Classifier: Development Status :: 4 - Beta +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL) +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Linguistic + +Chardet: The Universal Character Encoding Detector +-------------------------------------------------- + +.. image:: https://img.shields.io/travis/chardet/chardet/stable.svg + :alt: Build status + :target: https://travis-ci.org/chardet/chardet + +.. image:: https://img.shields.io/coveralls/chardet/chardet/stable.svg + :target: https://coveralls.io/r/chardet/chardet + +.. image:: https://img.shields.io/pypi/v/chardet.svg + :target: https://warehouse.python.org/project/chardet/ + :alt: Latest version on PyPI + +.. image:: https://img.shields.io/pypi/l/chardet.svg + :alt: License + + +Detects + - ASCII, UTF-8, UTF-16 (2 variants), UTF-32 (4 variants) + - Big5, GB2312, EUC-TW, HZ-GB-2312, ISO-2022-CN (Traditional and Simplified Chinese) + - EUC-JP, SHIFT_JIS, CP932, ISO-2022-JP (Japanese) + - EUC-KR, ISO-2022-KR (Korean) + - KOI8-R, MacCyrillic, IBM855, IBM866, ISO-8859-5, windows-1251 (Cyrillic) + - ISO-8859-5, windows-1251 (Bulgarian) + - ISO-8859-1, windows-1252 (Western European languages) + - ISO-8859-7, windows-1253 (Greek) + - ISO-8859-8, windows-1255 (Visual and Logical Hebrew) + - TIS-620 (Thai) + +.. note:: + Our ISO-8859-2 and windows-1250 (Hungarian) probers have been temporarily + disabled until we can retrain the models. + +Requires Python 2.6, 2.7, or 3.3+. + +Installation +------------ + +Install from `PyPI `_:: + + pip install chardet + +Documentation +------------- + +For users, docs are now available at https://chardet.readthedocs.io/. + +Command-line Tool +----------------- + +chardet comes with a command-line script which reports on the encodings of one +or more files:: + + % chardetect somefile someotherfile + somefile: windows-1252 with confidence 0.5 + someotherfile: ascii with confidence 1.0 + +About +----- + +This is a continuation of Mark Pilgrim's excellent chardet. Previously, two +versions needed to be maintained: one that supported python 2.x and one that +supported python 3.x. We've recently merged with `Ian Cordasco `_'s +`charade `_ fork, so now we have one +coherent version that works for Python 2.6+. + +:maintainer: Dan Blanchard + + diff --git a/cres/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/RECORD b/cres/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/RECORD new file mode 100644 index 000000000..a63c709bf --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/RECORD @@ -0,0 +1,97 @@ +chardet/__init__.py,sha256=YsP5wQlsHJ2auF1RZJfypiSrCA7_bQiRm3ES_NI76-Y,1559 +chardet/big5freq.py,sha256=D_zK5GyzoVsRes0HkLJziltFQX0bKCLOrFe9_xDvO_8,31254 +chardet/big5prober.py,sha256=kBxHbdetBpPe7xrlb-e990iot64g_eGSLd32lB7_h3M,1757 +chardet/chardistribution.py,sha256=3woWS62KrGooKyqz4zQSnjFbJpa6V7g02daAibTwcl8,9411 +chardet/charsetgroupprober.py,sha256=6bDu8YIiRuScX4ca9Igb0U69TA2PGXXDej6Cc4_9kO4,3787 +chardet/charsetprober.py,sha256=KSmwJErjypyj0bRZmC5F5eM7c8YQgLYIjZXintZNstg,5110 +chardet/codingstatemachine.py,sha256=VYp_6cyyki5sHgXDSZnXW4q1oelHc3cu9AyQTX7uug8,3590 +chardet/compat.py,sha256=PKTzHkSbtbHDqS9PyujMbX74q1a8mMpeQTDVsQhZMRw,1134 +chardet/cp949prober.py,sha256=TZ434QX8zzBsnUvL_8wm4AQVTZ2ZkqEEQL_lNw9f9ow,1855 +chardet/enums.py,sha256=Aimwdb9as1dJKZaFNUH2OhWIVBVd6ZkJJ_WK5sNY8cU,1661 +chardet/escprober.py,sha256=kkyqVg1Yw3DIOAMJ2bdlyQgUFQhuHAW8dUGskToNWSc,3950 +chardet/escsm.py,sha256=RuXlgNvTIDarndvllNCk5WZBIpdCxQ0kcd9EAuxUh84,10510 +chardet/eucjpprober.py,sha256=iD8Jdp0ISRjgjiVN7f0e8xGeQJ5GM2oeZ1dA8nbSeUw,3749 +chardet/euckrfreq.py,sha256=-7GdmvgWez4-eO4SuXpa7tBiDi5vRXQ8WvdFAzVaSfo,13546 +chardet/euckrprober.py,sha256=MqFMTQXxW4HbzIpZ9lKDHB3GN8SP4yiHenTmf8g_PxY,1748 +chardet/euctwfreq.py,sha256=No1WyduFOgB5VITUA7PLyC5oJRNzRyMbBxaKI1l16MA,31621 +chardet/euctwprober.py,sha256=13p6EP4yRaxqnP4iHtxHOJ6R2zxHq1_m8hTRjzVZ95c,1747 +chardet/gb2312freq.py,sha256=JX8lsweKLmnCwmk8UHEQsLgkr_rP_kEbvivC4qPOrlc,20715 +chardet/gb2312prober.py,sha256=gGvIWi9WhDjE-xQXHvNIyrnLvEbMAYgyUSZ65HUfylw,1754 +chardet/hebrewprober.py,sha256=c3SZ-K7hvyzGY6JRAZxJgwJ_sUS9k0WYkvMY00YBYFo,13838 +chardet/jisfreq.py,sha256=vpmJv2Bu0J8gnMVRPHMFefTRvo_ha1mryLig8CBwgOg,25777 +chardet/jpcntx.py,sha256=PYlNqRUQT8LM3cT5FmHGP0iiscFlTWED92MALvBungo,19643 +chardet/langbulgarianmodel.py,sha256=1HqQS9Pbtnj1xQgxitJMvw8X6kKr5OockNCZWfEQrPE,12839 +chardet/langcyrillicmodel.py,sha256=LODajvsetH87yYDDQKA2CULXUH87tI223dhfjh9Zx9c,17948 +chardet/langgreekmodel.py,sha256=8YAW7bU8YwSJap0kIJSbPMw1BEqzGjWzqcqf0WgUKAA,12688 +chardet/langhebrewmodel.py,sha256=JSnqmE5E62tDLTPTvLpQsg5gOMO4PbdWRvV7Avkc0HA,11345 +chardet/langhungarianmodel.py,sha256=RhapYSG5l0ZaO-VV4Fan5sW0WRGQqhwBM61yx3yxyOA,12592 +chardet/langthaimodel.py,sha256=8l0173Gu_W6G8mxmQOTEF4ls2YdE7FxWf3QkSxEGXJQ,11290 +chardet/langturkishmodel.py,sha256=W22eRNJsqI6uWAfwXSKVWWnCerYqrI8dZQTm_M0lRFk,11102 +chardet/latin1prober.py,sha256=S2IoORhFk39FEFOlSFWtgVybRiP6h7BlLldHVclNkU8,5370 +chardet/mbcharsetprober.py,sha256=AR95eFH9vuqSfvLQZN-L5ijea25NOBCoXqw8s5O9xLQ,3413 +chardet/mbcsgroupprober.py,sha256=h6TRnnYq2OxG1WdD5JOyxcdVpn7dG0q-vB8nWr5mbh4,2012 +chardet/mbcssm.py,sha256=SY32wVIF3HzcjY3BaEspy9metbNSKxIIB0RKPn7tjpI,25481 +chardet/sbcharsetprober.py,sha256=LDSpCldDCFlYwUkGkwD2oFxLlPWIWXT09akH_2PiY74,5657 +chardet/sbcsgroupprober.py,sha256=1IprcCB_k1qfmnxGC6MBbxELlKqD3scW6S8YIwdeyXA,3546 +chardet/sjisprober.py,sha256=IIt-lZj0WJqK4rmUZzKZP4GJlE8KUEtFYVuY96ek5MQ,3774 +chardet/universaldetector.py,sha256=qL0174lSZE442eB21nnktT9_VcAye07laFWUeUrjttY,12485 +chardet/utf8prober.py,sha256=IdD8v3zWOsB8OLiyPi-y_fqwipRFxV9Nc1eKBLSuIEw,2766 +chardet/version.py,sha256=sp3B08mrDXB-pf3K9fqJ_zeDHOCLC8RrngQyDFap_7g,242 +chardet/cli/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 +chardet/cli/chardetect.py,sha256=YBO8L4mXo0WR6_-Fjh_8QxPBoEBNqB9oNxNrdc54AQs,2738 +chardet-3.0.4.dist-info/AUTHORS.txt,sha256=RtqU9KfonVGhI48DAA4-yTOBUhBtQTjFhaDzHoyh7uU,21518 +chardet-3.0.4.dist-info/LICENSE.txt,sha256=W6Ifuwlk-TatfRU2LR7W1JMcyMj5_y1NkRkOEJvnRDE,1090 +chardet-3.0.4.dist-info/METADATA,sha256=o6XNN41EUioeDnklH1-8haOSjI60AkAaI823ANFkOM4,3304 +chardet-3.0.4.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110 +chardet-3.0.4.dist-info/entry_points.txt,sha256=fAMmhu5eJ-zAJ-smfqQwRClQ3-nozOCmvJ6-E8lgGJo,60 +chardet-3.0.4.dist-info/top_level.txt,sha256=AowzBbZy4x8EirABDdJSLJZMkJ_53iIag8xfKR6D7kI,8 +chardet-3.0.4.dist-info/RECORD,, +../../../bin/chardetect,, +chardet/langgreekmodel.cpython-38.pyc,, +chardet/charsetgroupprober.cpython-38.pyc,, +chardet/eucjpprober.cpython-38.pyc,, +chardet/jisfreq.cpython-38.pyc,, +chardet-3.0.4.virtualenv,, +chardet/compat.cpython-38.pyc,, +chardet/big5freq.cpython-38.pyc,, +chardet/langthaimodel.cpython-38.pyc,, +chardet/mbcssm.cpython-38.pyc,, +chardet/chardistribution.cpython-38.pyc,, +chardet/latin1prober.cpython-38.pyc,, +chardet/charsetprober.cpython-38.pyc,, +chardet/cli/__pycache__,, +chardet/jpcntx.cpython-38.pyc,, +chardet/universaldetector.cpython-38.pyc,, +chardet/gb2312freq.cpython-38.pyc,, +chardet/euckrfreq.cpython-38.pyc,, +chardet/langhungarianmodel.cpython-38.pyc,, +../../../bin/chardetect-3.8,, +chardet/hebrewprober.cpython-38.pyc,, +chardet/utf8prober.cpython-38.pyc,, +chardet/cli/chardetect.cpython-38.pyc,, +chardet/cli/__init__.cpython-38.pyc,, +chardet/enums.cpython-38.pyc,, +chardet/gb2312prober.cpython-38.pyc,, +chardet/__pycache__,, +chardet/mbcsgroupprober.cpython-38.pyc,, +chardet/langbulgarianmodel.cpython-38.pyc,, +chardet/sbcsgroupprober.cpython-38.pyc,, +chardet/escprober.cpython-38.pyc,, +chardet/big5prober.cpython-38.pyc,, +chardet/__init__.cpython-38.pyc,, +chardet-3.0.4.dist-info/__pycache__,, +chardet/sjisprober.cpython-38.pyc,, +chardet/langhebrewmodel.cpython-38.pyc,, +chardet/codingstatemachine.cpython-38.pyc,, +chardet/cp949prober.cpython-38.pyc,, +chardet/escsm.cpython-38.pyc,, +chardet/euctwfreq.cpython-38.pyc,, +chardet/langturkishmodel.cpython-38.pyc,, +chardet/version.cpython-38.pyc,, +chardet/langcyrillicmodel.cpython-38.pyc,, +chardet/sbcharsetprober.cpython-38.pyc,, +chardet/mbcharsetprober.cpython-38.pyc,, +../../../bin/chardetect3,, +chardet/euckrprober.cpython-38.pyc,, +chardet-3.0.4.dist-info/INSTALLER,, +chardet/euctwprober.cpython-38.pyc,, \ No newline at end of file diff --git a/cres/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/WHEEL b/cres/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/WHEEL new file mode 100644 index 000000000..ef99c6cf3 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.34.2) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/cres/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/entry_points.txt b/cres/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/entry_points.txt new file mode 100644 index 000000000..a884269e7 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[console_scripts] +chardetect = chardet.cli.chardetect:main + diff --git a/cres/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/top_level.txt b/cres/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/top_level.txt new file mode 100644 index 000000000..79236f25c --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet-3.0.4.dist-info/top_level.txt @@ -0,0 +1 @@ +chardet diff --git a/cres/venv/lib/python3.8/site-packages/chardet-3.0.4.virtualenv b/cres/venv/lib/python3.8/site-packages/chardet-3.0.4.virtualenv new file mode 100644 index 000000000..e69de29bb diff --git a/cres/venv/lib/python3.8/site-packages/chardet/__init__.py b/cres/venv/lib/python3.8/site-packages/chardet/__init__.py new file mode 100644 index 000000000..0f9f820ef --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet/__init__.py @@ -0,0 +1,39 @@ +######################## BEGIN LICENSE BLOCK ######################## +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + + +from .compat import PY2, PY3 +from .universaldetector import UniversalDetector +from .version import __version__, VERSION + + +def detect(byte_str): + """ + Detect the encoding of the given byte string. + + :param byte_str: The byte sequence to examine. + :type byte_str: ``bytes`` or ``bytearray`` + """ + if not isinstance(byte_str, bytearray): + if not isinstance(byte_str, bytes): + raise TypeError('Expected object of type bytes or bytearray, got: ' + '{0}'.format(type(byte_str))) + else: + byte_str = bytearray(byte_str) + detector = UniversalDetector() + detector.feed(byte_str) + return detector.close() diff --git a/cres/venv/lib/python3.8/site-packages/chardet/__pycache__/__init__.cpython-38.pyc b/cres/venv/lib/python3.8/site-packages/chardet/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2916897d2910daa0c028a5075f20859897672510 GIT binary patch literal 862 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 BvZw$6 literal 0 HcmV?d00001 diff --git a/cres/venv/lib/python3.8/site-packages/chardet/__pycache__/big5prober.cpython-38.pyc b/cres/venv/lib/python3.8/site-packages/chardet/__pycache__/big5prober.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fcdaf9d56a63d517e3af51539d3325ffffda142e GIT binary patch literal 1146 zcma)5&2G~`5Z?7)+$brfRe=L1I7K4$p;Y345Hv*<5-CU#7av${yxYWOZHL`Wt5m(E zQeUGSd*gX5aX_4S1y0P^t!jjjSZl{Kv+Mc!=JSVcw@qMu-TwaZTR_MUG@8o;<0Wjf z2SN}*70GB!De8`LGBF&bH!IbNfwC{B>mKsjh2Zc!U$;fgmhdi04xdiWn-E^|Eml~_n@!Y0G{wn8c zVNwHU-Q73)J8U#$!*_eH-zJdYkL6xl<|!zW#8i;jxgdvBP~n`1u`4~{3h$gOY3zeu zRSkM@K|B&;)vdCP>FW{`?BHghj`4AuCm<}b^o%T>OXmxr#Jbj7g3WvzED5|@XXG-( z6G0#@J?O2JzM0RY)_^}LL&nlPwTx*DsD1RUBo!XaWE$sDZi)s9j3W%EQkTA#M%pV{ zdPb^4c&{*)C~gd6SLBz8rbQ;B!=e~-9YG^UGO;E)IXUUiYNMa#R!%fWZ2QLYTyQN+ zlt9?%Smwu(O2^S`VW&mDz4a_Isg?a1Pd@PpTu5MsLfU8yC_y|J!sm5^FCJn+NP-Tn G9``q;$rtJX literal 0 HcmV?d00001 diff --git a/cres/venv/lib/python3.8/site-packages/chardet/__pycache__/chardistribution.cpython-38.pyc b/cres/venv/lib/python3.8/site-packages/chardet/__pycache__/chardistribution.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c67c9e07e6ee49164c2ab50e3066e5c9621739fb GIT binary patch literal 6232 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 R`l=-T^(TZ)Mp}L+_y+_74$A-l literal 0 HcmV?d00001 diff --git a/cres/venv/lib/python3.8/site-packages/chardet/__pycache__/compat.cpython-38.pyc b/cres/venv/lib/python3.8/site-packages/chardet/__pycache__/compat.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9719da4269cec1aec904896d618782bbff487700 GIT binary patch literal 367 zcmYj~zfQwI48|{aNt+hBAjC7!Aw7vM3YIh-Z}Qi%WDSanVG%!bL4uCS*eKMLwTBD_2fdyNQnXwG-wL+R|av@_R; z$=gkfF%8i--K{MPXF#R74lr%49>NDsv96#=@){w0GJn>dZSmve!fim#oXfSB6YrK# zV37O$KC4b5D=os@Yowo9Ky8ioCdk4=kUOwDxh`{A)wpnWJi3*kM93;#tn{1~iUlnL i%EE0bjiah=(z}f_+cn%@(fe>gNJT%2DbuLKPyH7`9%QEg literal 0 HcmV?d00001 diff --git a/cres/venv/lib/python3.8/site-packages/chardet/__pycache__/cp949prober.cpython-38.pyc b/cres/venv/lib/python3.8/site-packages/chardet/__pycache__/cp949prober.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7b39be9c59d1f088d46df8d129fe44bf9fca8997 GIT binary patch literal 1153 zcma)5OHUL*5bmDW4!9tq7)?CsiRdy1I7niAEyM#Z5;t7tV5fJw*&Ut7+T9CT!fi?T z8+hdA@0pwNAdXPgQkyRrU9Mv%jz~Phfms|MBTni;$n_G=~SyYk2h* zOo9lSk(|bqqU~f(?#8aQ-OS7V*tfQq1$irOQSy!mUj(N_1k#_maVT1SvKs!PkZP4y z54ZQbJ0G`FZB#m#n6xb36g->iRKwzOw-jkH>>F-mk0+zFkPyA!n`9<^J2kR9;;Jvr zo+<}Y!OCKHZ*yal^?R)MVQc$+0wrz?_tMiFU`P^EL1O2O98f`pa~j63^n@$CQ!=Bm z54P%)uJLBzGv5R=0^imN zIS+9~5J*gSSLZ5UPsUQI01j6nV`-5Z#uO%0KE~z}iwD!Wa?oE94cr(<;EtuLd?mFs z7qs%U%nsl?$5@hatr@!@zfCkMa~U0!<$$XQF7jC>Mn^|SN1bu)bkf4eq2kC!M;l%U zu7r*fNE;o>;xNk6K{TG4QCY07J&$y1WM|BiFMJ3a65vEg6D4Dy0ullJiGCyhCjq z6}M#RYN)6d)^aU0;NHl*{_(5~tK0eD60(|Fg_KkQL^X&KMQT$wdbwsKd{JNUJK;W^{Nj|iNB1!=-b0J|PA62?_I+Z?u_%yCEa94Na|%5=|* z{W0^r%<#N%LZ=a4Z+hPIsUIz$lsu0n0lJ)=c1^F|Yg$%THhaz0<)L+O=rx`=<}V80 zgo&m4Gp>!2F{_;=$-w8e6P`SUO^MpY#l_BKVeEu)%7)xe!zA8;bHo(lFKPiCw06$o z^I8-RYLiPqAbwE&t|r2i?JThYuLW2&jE<;IE;*h{2N9@rwU95U1y$Z%0|igNhprDn zy&V*{L^W5ZCAZ89tk_UogBeU~D69n68&n6-%GsT^9}lOHF8g7WGCq6yuE0V1$oI&Z zd{K}KCIRy&ljxG93GwAj{r>3+*wzx)et&@{&%^dPR@YoAJox+`sxLsmTmS-uV)>fw5@&1Y`Gt;?m69h%W|xaU2nVkqxwl5Jzedn(>3dMRA@QbT0T<;F3`ygT)6hKlyNLD{xmCx6}d7p~egtQuj@o-Ty z2k#pCS2Y8PIACja!ZAOtf(vzWV<5{d(=nTlWgleve&^I~d6tuDcE|CK%^Sn_YQ)L1{p6Vd6P5VF&4$1Q|~%i(d>3RU01W5-rIuk2^_bw z76iPz76eT1J#_sB)NN(TbgI$POXY>?mX~F@-DA(EEDl&Ze8!@1lq7Wav#-_zR9%0=t{6AwzHXZbb;o*ay85ZzwvNp96IWaQ>nEKaaL8jb z+Xy0Gh%o~Or~GqR_Szn0qmV4|DLnWVL?B(Ph#OcUms2@D3qW2Q7|A^l@g=C+@?t^X z5NSQT-&~>DT*UKo_S^00aMfb30!UtwHuOps3CIjCXX*EQkRB0hT&4_H5-de(V!Yoc z(9^GS2|-K~__V;hsmIXVFs&jcq|oIlBxA%<$i!tI{}0YR z{}peMcblPsQWgS=!@cClx8$rU3 zQU?);8-S#(Xq+#4jV_x@rX>Sx^Rn$qdgn-Q9Lrl`DZOu6Ak!Z%K0kgybmc0A(!KJ% IyC9(d2RDIyoB#j- literal 0 HcmV?d00001 diff --git a/cres/venv/lib/python3.8/site-packages/chardet/__pycache__/escprober.cpython-38.pyc b/cres/venv/lib/python3.8/site-packages/chardet/__pycache__/escprober.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e8b0d7badbf408fd7fbf9f7b54a37983afc49b1b GIT binary patch literal 2645 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 literal 0 HcmV?d00001 diff --git a/cres/venv/lib/python3.8/site-packages/chardet/__pycache__/eucjpprober.cpython-38.pyc b/cres/venv/lib/python3.8/site-packages/chardet/__pycache__/eucjpprober.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6a1178181da7280ae753883e645f89a1f7bd20c2 GIT binary patch literal 2463 zcma(TO-~y~bY}L$YqJ=Kgao3hB2sg(RB)tJRSr>=6lgva48rD6OYL^q8O)m9wKF?T zg5{h{m1}d%>5+f!~m_maLh3&Es{)HU_W&HH3`cD6#``|a)@KmJ-J zoAHmORUuH*ao)}Cv`in!R@4!dL7T;PEt-Qor=NT zWG3}HJ|&L`FLCdfa8KA1t24{XEmE(%qadcvw7)I;dvVrnsZa^+Z-&u9oC!nKslL8B zOjP{skrHbMp==3-r-g)_`L#Yjzjk&BR+lz**Pd>#$GMX6-cZH;>|qurM|qsX<~6gq z*3Xo9rKZ-aW<6+a2Af;!8_yz8?9ykQQTa9?f^;Y+9rlLoQ%*TM_BxiqEp7vD3x_-0 zJth;{aRE0k2fW0~ymCxB9-rYp%;h)4CY=gcVph)>`Nhj3G|TyiI10y+e+57hMaN{q zPS`1-L|Mw703A5Woe-Ey$}@9$Oin6zf|C|`OPlo>?c~FOkg^O+v=;<%7ONnT4v^Br zwQ^+48RV&SkzU|aHVi^E;t1}SaIY2>Cj79h9Vv35-coJnBH4$z90XAk=6MjjCI6_# zK|d9Z{eFKhlnr=iPedwjynOj`Wl#_+G5Dk_Lv+|muELCmlIM*G*fw5>>_sDq_ZovE zbTMXg342X8;HrElx|E zKJ>o?Ywu||2s7~br$u{7n01HX9*o*^v6n1=ejqYBpHv@?QRp|NO&wX=x z7EbTOdiA6AIav1%|Jo^eZI2meu=4vDa(oGrt9ON4_i>&-xr)@-K83mn*tKaIWE3Yr zLvAe+gg3~~$YJ{YCwAdB<@T90W~42Erq>VIFI3(!oNt_x0zX+iMd?e2Hqz(sft3Y_ z4yQS~bvs{%zak%&4`Q_p>D!mfp<3R9ateFz(Bcw9>)m_!>Ng>c!D~WWiOA$Etm{e! zl`?>YR6=4A($2=t&eo20lYX}=q;|O28+PRlWVD0;ovGdCRy)|-&~9;4yHDCJq`mL9 zcAM+LleTtR?T0&UeYFe084aZr8O#u@AXrxdC>#Z8vPj$eLU0K!3&a~$ba{QFy|LDQ z(tM=nx_uRhtUv4?1Uyust{R^GY(M5Ai-ewUJ>J@BukE&j_T!xmAfBz)9XXHOJTwI8 zC^d~CScR=8nwmn2t?UaJIaXAU z`X%3Hv|{1#ZkbBltXH)ovSFH=xGW-gF5Nq;ctvVRtiyV~@V*JJwD=dqG)L%l*j=W2 uVbLDl-XO}q0T=pSRAcXcVUusLqvY6~Y8VK`&-xeZVOGTe literal 0 HcmV?d00001 diff --git a/cres/venv/lib/python3.8/site-packages/chardet/__pycache__/euckrfreq.cpython-38.pyc b/cres/venv/lib/python3.8/site-packages/chardet/__pycache__/euckrfreq.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ddcf516aa9406f440d0a564914bfdad15559c238 GIT binary patch literal 12075 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 literal 0 HcmV?d00001 diff --git a/cres/venv/lib/python3.8/site-packages/chardet/__pycache__/euckrprober.cpython-38.pyc b/cres/venv/lib/python3.8/site-packages/chardet/__pycache__/euckrprober.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f6b13e1bcb80f8ddf762cd93852882a82342dc72 GIT binary patch literal 1154 zcma)5J8u&~5Z=9)FUAQW3J4@Bs4U@J5ef=~04Jgd4k%WdD_E^>H}R2snB8?ETj?Ar zeqjpp*ecnw=` zfe=K{jN~+?6m=(aayNFZ?q*)@$G+9QEXZ4Ni;{Ol_#!wXB9L_9#-V5pNjLmOAyk)E z4+hiBq;F?N_QzZerTM7JkyLQ9)-Od`91aaPa=?>uT1fCd+TQQ)>}{pmsB|x3huJnW}yfd<(u@Abf z8}#6ucqGQUTh$$#qpmW+CaxFim;kqa2Eq_SPszf$aJ~{sjBC6F*vvP*+))1tTC;$XHsWhB1W!m5;uq#6rS!u5cvPebK;yaRg#6Rpl$GrMaY) zr)72k?~Q;>Y%Wi75BibI#>zdzzUwr zE_k#9f;jVs&7{ps|CP83c1k6A@$bZ8#*4!#fYECtz18XUg>Hyr#`+km+KlC;m}aPV z82d8iS$$%$t3tpM$YEw`4Z^B*5Y_V4ToajPK$IH*R`3dCR;zZr4c65}3?PaIRw7Gn=teC!6A53|4ZeDe L1tAeS)IRPXkX0G2 literal 0 HcmV?d00001 diff --git a/cres/venv/lib/python3.8/site-packages/chardet/__pycache__/euctwfreq.cpython-38.pyc b/cres/venv/lib/python3.8/site-packages/chardet/__pycache__/euctwfreq.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..64421e8437861bf7926d8aea127f06f0b7a6a7da GIT binary patch literal 27195 zcmYk^b<|gNvjuQcQRx=tfFFx}~LCKN5=}?Xeh=`(~-t+n0 z`^R;ycbwR>XU}}kBZ{uKLA-cxMhpMgli=xr9B5~hnEnuoDM^CHw0^pKky=7J2owQ)leJLC_l>&PirCQj%P7uENz(2Nhm zs812hj1ijD3BqbB)#~v=Q!gZq+Mt>yEJQuUcbzvsB#m03H#e`Q-YDJ|;T}Plj~0Bx z6h-w_I4){hC_HMCYALx-gwvT45rS~Jpqh@G%o30r26YSfkNPUSM$`=8byU3yg$K7m z{-Q6vePe11qi9iSwH@s|}-UX^(3dewqWGaR? zh?)aj14|vlE5pqpZLZ<9g#$ux@R-+;`Uj5lI>;B{T2bXKQ{U3RBVDRmQLZM^!$>RW zo#z_0P;C|FvF~@PeTBb~mXFfnVHo6#uPqmTzG(|PjT1B??43wjHuQScG7$TfbGtL>62 z;1c2c!Yh0avKm!}@NxE(yG6^`0WrJOqct|%QWDXGvfzZ%9?Q#c!rVdl14S7ev)t#&CPXumY+c0Gh>0a4~WdD zV>@pd1zU8~LQu)Hg%qS#?I`y_s4BRRWrXlFr57n(5;0El8ZWPoA|WJr5`u$nI&$j$ ziuZ<_M#FrImj-yL-et@%VP{)rBD}Z5)&Z_TcorS&!fMbM)m}25dw@*#SR8u6w+e5X z_G#z^vxVPM)dlV@+!%gsF%o+QXD7v3S<+=W&sysKj+Z&hf5tg4qB=dAT> z!bOprHWVHdLNJS|3U>}91NHYPIO4>ytuWGYu7cE{>ZL+X{-j-R2ECcde*cMDy{aWF^X&dovVj7rRiHwA*7kKB5jO)5}tY2GL z4=yXxX}sOxprAd{|H6X>?}uJcQFzvFPf+Ece!AYx2F2I5g_ln53`kXS6YJOj+`t~u z6t44juZHK}X!)qD7g11xk3fw2EV-UROh}ld_>kz*S9|Ow2|s7hQEkVB zSLs`YG{3?)g$z3U9ck1$kos~tDg6-cnvU<84q+h(yTUE)_8o9lUTwGy^z|j90Om4s z4T;P{RaZ04P_+XjAxJm545qySe3Dm2VV6s`mfH&QkB*I@pkTG(W#m?>{;Lp&jFiki z3U(X$qmzs!ZIeBA<9jH#hj$?C4IZGXfn_I_F$flTs7>gTp}KDAMyeyIngqN{*pFEV z97G-}hxh2%!^ z_Q)O5+s2dapemhdwOzLw+;e<6Q5_)YtioxyLQGa+e;q$jKg4cbb^IK;kZ?HMWAC;b zt_bssYGQ?V6h`v?HDftdhY9*vxDLSx)ek~ka3Q=)(AIGh!2M3&UMn2YvC)=2)~k9U}b#5{%S)6nL=A~Fa+PSrjgw>)EAns4*IR9GbJh3W)p zGf?#i!=N3n6B+NJdL7j-v}BdbD_mytL;BK^hg}yuQFNN7IUeq2ZcpZs+ zliZVVLqQ6JVQ>xK0fXL#yY01_Qh$!p{k%VrZe~vDU96DP+~uTgQCKSc+D66jeFIko zX%ptL!#*{#8NSA5WF+X0yS!oUX&omN4k>(O!83A?5aa~e!t2UgX4)@Kk_+=O9qZ92 zLGZ7_E(GP7*+f2pI|xz|qy@-X^f{59n`hoGYEe}nuop% z)u3UWtG0+dR%zC6>fE7xede z511dAADK?Hj0aw6)gA`zl6%vjR;Xt4J_^0y3RNqFkMO;3?x(;9X=$VISYZ%-EewBX zM!@{U{H5c3c%dL<3YV5!1y{^N{U|q4n9Cl2(((jfb-7hZ!CGpP32?w733-N z2&6U0uQtj=T1MA>Y*2KhPk4#6y^mlvrG0Jrj@(Pk4|wh6`s%#~@)Tba-meH^kk%F7 zK!u*drwU8F{%^cz%4_6Ebl zj-Z^jdT_5$wRD%&&OREr0IEN9{K=FR-c@a-V=24t#X$+ z;i|zNkm?T6PTL;qAM(;~Sf-lZfk<;OZG@Ff%SYNjjNep_TBiDfpu`{_pf8B@IrVuX zVdw=lP5Vr^nt6+$H+1AP{5)wz&HWd1bJgC=->7DQ3}F06{bo^zR|5OhUR5~IMnoV=ttmg%ogC*`2I2SH#4rAJC*mZTobq#AwjSzJW22@au<9B%(&{IhRA(kS~P`M zyuWq4t5C>V(XiA|XlTLr&Fv!`Wza>r-JYV8FbUI;S!+gN1pm=egqIVzDUsjUXfoy@ z_%b1A6rs0tbXuaN3C+906$*15?1+808lGQA47g^fUeY{(<~gd-^|s@UR&8iT4QGGX z@LVBZ5EjF~pF|%MuCW<0w8dn$J9c|*dki|Gt&y-98Hso+6~5ILOGiS3dTTpMWNf() zgon&{P52zk>%4w?Ur`@N__t+6CkNXCq{;CfV( zwB@s9a)lI3F&%vjPbqwxNyQY>(F9d>%*C8;H}4vj@0oYtUPqrg^nwxAs&B#OykDr= zYne1~#SuJ2(2#-xM$Q6Bt9sovJ`?WK@lrLNLPp>ZiOj4wncEj*3R93CWCNwq5``u& zEfts&re#o_jv%_~SERKhErxI)z8mIdgxe{6Xn0K3z7)(AW>PI~WF6Ot?ExP1`sjF9 z^)q>5eP3ImIAgc3p|@QNFgi8O?=zP-C_9aNOwj&kdiiP!fWH< z+cMd-eQJfbTqCjkLnCzalJ2ikC^qv{bfj?6% z0M`m%Bjz#_7t3Iff~xPsrErb;axIv&hCejCm$eGPt%kdXzOb+*Tyf?ZK@Am(*nBrZ z1sT8j6;&l184N@uum_3w69AV=eG0suB}EO`!so?s5}=OGj>? zx2WSRz?Tr;n@kziBzorn&t*pHeFs%0;6FW2O}RtD&y6grZL5Qo<2B;dw^99YP!QfL z{0D6W@tkfi(vFT(jDqqy;wxm)c0yq&(nUIM$X&Gl+q}Qb{R(8175)|$$5Mipo6IHj zuN$6@(uTsnnUmTQ7}OKh9gr6w6(~5RT9KC!B&KWpa5W^l|0BMqgQ>AKX*)v6w1ygE7C!Bz60$a^L7U%~TU6Q}|EsP+QIh zPA+$tf(gQsVIep`=_Pmhl!7gelZ4WwOm$R6o$fGcB~&kvQ6n+~q!jvn2Cc-BT&}W? zpWr52CYgOdRjsKl1;|F>WTds^YBMPnD*FDqBB&!*1oQsT1m975S=%im|I*uE^=)kf zc&T_V^`@}uR&w8wtBa~0vkJkF)*t4hiRNG>;pPx|jNIddr`8r-wJ7HLdf(9T0IsIt z6CJFa@DVSik-s2l0Q?ad(^b)8C}E>F=}WDxDS}TZ zD6V?a>Cz}PQ#c@($=tMZC4}ki+g$Zsg>(ungq5AR3e!?ph=N+c@A`6LP|!*tv$g@$ zR|TF-czP@un1KrY$Vf|RYaMNvwoDOxSrA;YWk$V2Ty0|HYSx+pk`<(#j#F^$;R+Kp z6=`Z_yI1(e=FNNuMdWtK?PS{PZHn)2d>w?_u1-}!N z#vWIJGpWAI)JM<>uA21|fqVgyS>cl~3>xXJK~-nCm_!~lC`!1`M(1hS!DL3dE7Tl( zukA~1qZKCbVmf1!OmzynAnnSmBcrH&OM2-H4t5RI&mlP2h5oG&5|rg- zw{$mcL+Kl?@P|SyBL`b%v$nf(QF3RkP{YU(2K{RD^9sw&*u``Y`GOTXdSLDk(wm?G zmOcq`K}T#R2L(0p^#tz4EO);!6}AZrA;``25&mZBL3X={ASsclR2RC?ALu&@r|?D+ zc@Vg--V9_6vck7|Ynl6o>Uy|w3U~FsM^$arE^wEalIBi#rX9?`=nv^l8!8Bzkoz%~ zGCsY2rfr7n&&y2OYgjgb43HbeTkRx+vE&sFRLE)g5lU}{CfJU7lr8g-R)?zZ4WFd< zb)+9^JB+0uToIvuG92Vhd?R=r=B^ zq52s3F6OCN^23di8_j$RQpRq3cw^)ixzH8*qAwrN~>hI51KI{qQ(Ddt(ghmbC|+a}9YH+&b;({i&x<}lZ>Ow-$h<~N0N6{5p^ z%G<3iKbE&t%UZPv1%(ynfy`$XFbkPm_$pIyLq{H}@)6$DjAqOtxSOgynZv+8;46yx zeV_78BYW_g>o|>|1@8!OOWxv;CHTeqN98^-_XK@Q&@W}GC>&${LVuiB%#3BK`Q2qX zuXvaXo}((ETFgVO#rF;c34G%lA}{DJjXlM5)fIZ;I>Kk#sqh9tM=WoJVNjCSTgP|=rO4G_=fR)gwf<_6k4i$S?Gp>ro>ykM>5@cyX=T2JW~S1r<*Ed>-of0c0)u zWXu#)8J+VB(l+y|d9BUb;-N|nvXQDU6^>EgL~kXgr;bgkZH??G*N#`no#P_yi=|hH z3;I~*KLmxtYH(ior`mit4Ac5KQ+K&caL1YPaPOg-YS1**&PexK;ew7CAtYE!)jPn=Tw?^jT9)}7 z%NDuCs^4RYsd`UXmbVYpZOrci_jAcu4z^5nGhA{a+o*nn;0xY#vbEX9H2BmKq=4rt4z;{(hGg_(f+gJeZ;jVTX&i}1L-|8&IT-KDCExsPcs>DX0; znGJe|bOeIh)*r6pO}Hpm8zEedpaf}cc!wychTt%702xPkN10>HX>B8c=h^K{7zU%l ziwCWo{kB{e^cRUNMNkDDA6V-izAyDop{gs~&kBWwb%;D}##XC#Q$1pZFXa;G9f_*D zLTStiL#p6~xoxd*62T`HJfR~Ymb!Acd8c?&LsdZm9bbWLQ#i@{6hU>Hzky(&X>kni zVcK+SoeFWmLB07wD$|?@!PmkXdROp1c9L;$pSnQ;xvvdBZPi%9=GvwSd!qkFwI+fV z3Zrb9%J;m&twvyJPQiy%b)srMmI@#V<-WGUH_Qp(SC~%=&oI5r_=4Pf_&!nXEtg2| zI)$&9(`3Bjoz+&0pfhqm8F`kfKH5g}n!=4Gx3643=A5?m3Nc6<16Mm_2|BpO*I3Sj zoKyJT#V-hZ+U>mDMPW;%aj*=t<+pN|n9Iyy;4)r6i*Nipxhu?A1ov%pRd|i*fgqQT z-%Y!3{W{i)NneygBDsgIwuHX#&8-XaJ%aw$`qH55!gX-b;L1{PL+%Qy2j&i9rl?+^ zWq{s+Oj(f5n0pg+Lb!yW5x~XCn1wk969rd~f{d#5dF4zisW-b^VuL=!+(31d2fazl zYNQ_tZwXiGxE}HagFV1)xrREnDy%Z?j@(&~T+Sh~lhzx-Xyyhjjda9wgNxR>tK%M1 zo~rx23ZWO&H=`o27w?7{4^%T5l!@>`H18MwV1<_;KY&z1^&@Yv!Ul!ma3=}+hm4sN z+))_k1DUH(PxzSEn8+l0m&iRtb;-zp*I#c^)e=Z6o3@5G54aV+|A6aSIt{+$3TwQ~ zLAkTQ1IhRa-_J}FBL~}P2-Dl`e^H3d%ctX!umI-Aykr#IF>MI%KZCXlhawop)bkV{ z@qX79%cCR*9_RK=jcmp|!I#2}lyI+@RZMGqztCJ!$6_nAU=k~gXL`V02l*9C71y{d zm)NxU+I|*3Ro!RCZ@dY5E2-8evZ}Uc3e|Xnb<{)JhiOh^c6`Gv6VEvZgs%{c_H7gh zFBE(odcjO#B8PYY+}1;V4E(nvc5(3$2u4OuV%j;we*k_i{DWy>T1)0n;dmln@Y-QH zuj4q@`gsf99|B5 z9kHCTQG8UF;Syk3sal?i7XDU#R8n4b57kJ=bJLqiT#QEg2Jp$v`&x1pbj*?Zk_i*+|ASmLqc`@cncOIacTm^hxu;fQyRpDd3P3U`@w;4+%q;H_=3Y?tWF-CS) zt>sK9=Z$9rna>%7$wPoavD_4PK0n6MC>#+M2~aw|MEts9*G zf-9;#1@EY)X3{Xd=u6A%&5Iqj1zoYMr@6b{spO7EP|Zow0srHn(ztlC&Pu7K2&9i`KZBIhR!MbNXoBUa4w)NIZaU2^O&bIJm5uI&^g&^` zehP`HDyriOFBMz{bI0oKq0rZ~9aLph_yr^r?_H*abM^z-VCl?qKe}HQULWfFt7a9x zr;v@8otfr19pv6YI?RHpd7miUz&xFo1314o`hf8FggY%WiRP=!HRgz=lTrGqYEHN$ z_IPMUN%|VQUq87%rj?SrY0y}6bLp6jY5>js;fBCHcB_HF0~K!R$PN6Vu)ac0Gh$H? zQ`;0Qc|hK0ZtM77?wBY0K<<%|Yg{O=@UgIxL3QQQ2zOehCB98IYC?Tlg{Hjws_BHy zg!!bJGsquY~xmcqgy|Dw-=>Lgr}aBeWhlO?5~2)TnIhYfEKq*F*PH^J%dq8hAPmxArg5aCR7 zC&3*fD4Q9rjJ#q{ahi)5J`1j!>rOT85`t?UuNCI>$d(wNqgn z@P`UTF;9al#w*TbP<%3JtD?=AFe zsK2c3Gp|t0(*AEZqNY=tR&@?l<&2CeEYJG^{al6NhF=Ems4XM<>XwXsp40FK|T5@Qsp(6_42H{O% zJ2Uzje#e3}@YQ7QAsq>~8}mGSya6}C3MpOaCCCDhj--vU(R{cj3hgm>U>1gQgB)a} zH1ZtvwaloDWwf?Tgx}Vdi795}WVySTj~cnqpdYBOqOG~GwCWfHW0_m%`yzN(@9#`) zgX%EPg`0Iu;nkJvg0CL0K64A{d(1aPHjo>Kxgl>4RYx4Qx1zrb}+y{)aSjRw&?OW0ANv#?Xdix|WIA}A{bQF3ottGnR= zErUH{7lrl)Md`SM?`oA|->*5;sfTs(i@uu4HH=46qVJ*{&+&&2U zGE*>5WfofDb#jZ7RspUq`i`_5XKsfC!A9r2DQtm$0{UsZDoj75CG`G{s=x4ad;@qN zJINfz%Bw`|#qzFJ71=uH(e2RjvJ;v1svk(b_U&V>HMZ<{N{uSvohbuW8vqmLuqgAT@&fIFXseECl|Q@CSx> z@-j`a3^Zu1L30gi7vV$D#ns-!*UQ|=Sf(&5Z1kbFpAdY-%(Yu*q%%FmEM~ls6ESZ^ zFc#@l1V6#$#9V?GS9JpLDGE}_^|$3=xfR+{5Pnmb2j3vWr=faH__ek{AOo~*72YH0 z6Oe&&vk96moWaa@gP*Os-?V>uF9{lqc_zpl9m$M5jk%__k+swA{50#3?H8R6r-(lOtRRo3c^Y6%7P{Hq1?H^H%CO&HF`l zm2d$W@s0cl?sL_6G}kn3xLiBAg>Y}neWqR2Wj1yPu1;adZ;mie8k=gjBA z*bec9jxU7knDxvCrVE14oO3m^9cd0`fe&Pj+*;;e7rO5_X_!S3eO{(Bk?YWZ4%dpe z5%Z?d1bO@weVQ4?@oiT42&9nSt_t<>ZBdABj~1?xR;~flR@)b5^z%HMR7W~QCn8^| z4z}uLukc?)B-~KdXbM*qwxS;oJPpD6$Ti4aY>y#u+d#H6^YuoTd*9qil>W+_i}^j( zPYBP+`-A2sSk{GnK^6P%z_ODWXZSAOLd(3P?JNcHk(MRnfZT47{KCFw%(cfJxxLIj zWR;c9lADMBEmOtf|fh=cU2oItfrS}l;FtbAS z2=6HK8kUuELv?&W!75=4VRy@vGx8Ylai*J*i;P@q-zXi!K)zHhrFw$*6%)%Ii|lq% zIGUEuz^8=g5LB_?*TQd@&kS#<<25r*%dPjIXLw@}tfBd=uqA@Aa_5BSnS&JMG9x$h zmpx*k%C2pLX&dlOB7B_Q)kbbcl~-;nTomCk^R#dZ;0Gt_%?Irn)@BdE3dyUf+KgH-Zhk7QC+Wam3P(~ z)j{>djQMc2R5xjxVE9^XznL){=|X0r!eF^-L>}e+8WIGb`OupoeTuItLDvjA$15$j z6*#v+pJSfx5Hqo?11WE#v~t7TFArR4e3Oh^Ap9QR7kbZ9y4Z7<){&U0YnkgH>p&jh z>jL)?zRlLUp<2}*f6LtzJ_UK=h<_+-330(C%S={y-`siVyEBt%xutD5g6`J($e`Pi z9PbCJVyS+h_m098Z9k|^<*lbLHpmPMPLo>*+};Xzb$n~u0|#r&8w+<&p$N!%2it%p zooUD5?yEL{+Zb72I7#m(k>SGXs?&w}?DnHvYAZbCZIFves;v{R*ZVvA?W#X3JQx1Kj6n4|Gm`lk%P$~9 zcrys!WVc6hkC`XTOod;0Pnpdizwz?A=@#J#D;)K$JyZA?{f}}foo*I_jW(Li+dq7)Jl)K#Ie!aOW5%-yM4#u4+Y?t+`jn-7xDA+{U-7w|*i1qy!) zm!MiGJg4KO+%2!QN%%@Q%DeqV}fG5;w1s5e%~7o7BMRMxf#)f~(G3$n+S|M8-Q zzZD%7or%H3WEKOLCpT6kbet+!`tshPUlUNFeJo!9Y?YC}{>fLECNrxi|D`ZNID%*7Cb8RQ-cJaYk^79? z=%%IAdtP-Ff{dz}5xlK19^V9}DjDTyPNi@s41*7?`kA)XOnh420$z?KwrSC<&<%Y- z!k1$?;F9lPNzE)(NMYnBaKG`=C^WXhLEtpzPOwKI;OIzyM!!WzO&w`Lx(n0lO~;%y zEj_OhNLGHku3+NBy$kXNg3P=G za?gba(QmUyV;9e&nou<>uL7!>Og3RfUQ8X?g=^gOLrb4Aw=05Js>{4vY~C{$&jI`% zbI7fZVEN9z<@FwxTZ<|u$P6rNm{fW{gFA#O0k4`|F1XxG9;T?x4_o1VVO8Ge_+HcY zf!t7SFU&nGHxs@8x+UrhxOL1=!U}}vaN@k$wz|+%KYodvWIf#L2#zq76+Q$`hxw>n z93~$H8-R~0tTk<;Fdx#ysE)xMXNpnZi@qZcQCt|;U4CFvF@ItC9ZP-$1(-MVE^_vQ z!WnS2!V3j=eDZIq7E&n89K~FOcZ^q*x6;1fyJ<1umpYD`@g*(CBU%)uyFn6~o9HMZ zSCUDskb;6z5ds~hd1aWg%reXTtZhH$62f0}{OW2GnVxoAEY}g_u3S>nE_jLyW?W=G z23f+C!~7Px<$05UGnp}&x7>`9%oJe-kOj8<+n|cVroa_YZSp8n;T{Q_DZI;UGxCHP zm2{NCmz1E#aKF3Id2%ZueM<9Jz}pQf4P05<107|A&5>5u_9w_Zg;SpFgsZIpsiGq# z`naf)scxn(8GU2)M#)u$TMG9J(v^B&6IN5G&a_ad!K=x{!*`U(E(pHx+19b(D!pZy zT5z?Q>-5d1ua58!xGiLSMQL5R&vew|)n|SrEt`(3n3I#cRYy6vZ=9(CTndGTyqB)l zh}W1oiTM=ML^uuZB+aLoreQ9a=cE1_q`eu<;M&=!GOBH+wIbtF)l5dd?pUE#`G=2!P?E!T!wOTjD(+6sSCJtkbHqn+GN zET7nDkLsDo3fgulq*QnUd{*IYVIsrZ>uu>7E126sm`+=Ae`)y|WQG+I^R_GO#@7*U zPei!hLJpBaM;zu`Pn({;)sdIcTaot~ToPd?1i4)396>3yWzdmS^}JkXkWn=EcJX3J zSDCig+|zLTc#S>9?8r#o>pH&V%|suCr330=uKm-t_t0liwali`-tf-SBd7< zM)nX6vVJcjr@P-VVNZpU^zDdLg=f+C=DlUc=cKJAsE^#Y2DL$YLtzH0{r2dq+KS`vh%~LtaR@FPs*`3*`P@0*j zV-oYZaIYiYKss5jCgyh#tiiWgZ%4QUkpeRXuBr96+heM58uJM=oteRWX_@9^RJQp{ zx%NnJn)a>DtAgATo+D!x$gjL_G0zsxVdgTA_1*@qrtMR?JHmOqOmcUH_n6~8>bY{4 z3_6c=KHLIkAyds-$C*XK#mo|>liX6?GUh(M&T^Mgm2{Hj3b|e5JGtY&gB5ZsnFk=N zc%S=Tl7nP-upZ%BLBGh~qpPM+NbT6GBVcFhY4b}=72y+0|0!Gpk_Nc9wXW#B=(>F( z*I?F0SV9w=HRB86I;Izb2llw&5bNbm=on02TBIrQZBS@n)md^?DcC4C&Z-~ittQvc z+)WCbnJvtERDXoH;9O)l+*PFa@Ktq^FP-Uax$1`R!#CTY6AD|gY-6@FJ3>=4d(3O; zD>Nuqzfr6DO=?#uSEhQa@>S~9uUn;TgZfo!)ofL_O!%j33I7jKrfl^Jt?E^2TH#vC z|IL)ET&8ZT`n6hBtXrW@t6Fu-SE#!-TA$dVl8E`cPoB;_yLZUbv1iY=ZTjS?-KS@l z4(#$qhE(kecJSk>e(Y#-+pa+v~Sa=ecwFo`gG` zYMZCmpnjcu_Q;pJaGt(V{W|38)uvt7Hl0F1yUroFL%%#7`nT&huw$PNy>s^(bS+Nt Z?mgT0@7AGY&hSWm!;dstteCN4{15Qu*dPD^ literal 0 HcmV?d00001 diff --git a/cres/venv/lib/python3.8/site-packages/chardet/__pycache__/euctwprober.cpython-38.pyc b/cres/venv/lib/python3.8/site-packages/chardet/__pycache__/euctwprober.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..df3ae587d88cec6f8bdcfd828e688a0157d99b48 GIT binary patch literal 1154 zcma)5OK%e~5VrS~ZAeQg4}ru5PE;b@Lpg9j2uLd~q#&hLr9EIdYd2ZgN3fkniF!+= z{*7|%jsL=JZ-^6rffF;{Mooo~@XE6@WA8k^`SxISwMk%o+y3$KdqBufG?teK#w*x* z2ZSJkW+bOErKmfZle@8NbvN^JKlZKeWkKGE8fM>6hdv% z>Rxx8ne@%n$j*?fo-`j+*_R4VHaew9i$TwDBfC5qriBFWgWZG9{^3rljY|7tla|Hn zf@f2mYB*f8hpg9S-S<1Y?-EFHZMm10eg=vpF%=|s&d3oJR5+($>`G6#!aF5%8vCHz zxAw=k!9GtXy!dzGFyqBw3}7G$7D=yly11|z;+U~M#;PV`c`3#j z>Mh2;jCod{SnR40ump0LsoH?B>NbdK^>VI>%rYR#6##2^1yQhEdIXBbKRl$Zz@bgo zq1KO-yP5YdA*g4i5Tt6OCK}A%$h`jdEDfu5JKiPM)kF*+iUw99OKs?-TCOG%zNi~~ N`49_2BDAP|oImiJ8JYk9 literal 0 HcmV?d00001 diff --git a/cres/venv/lib/python3.8/site-packages/chardet/__pycache__/gb2312freq.cpython-38.pyc b/cres/venv/lib/python3.8/site-packages/chardet/__pycache__/gb2312freq.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..508243d5a55fb3212d3e3de9a0717d46ec23db33 GIT binary patch literal 19119 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 literal 0 HcmV?d00001 diff --git a/cres/venv/lib/python3.8/site-packages/chardet/__pycache__/jisfreq.cpython-38.pyc b/cres/venv/lib/python3.8/site-packages/chardet/__pycache__/jisfreq.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..49a307bc62bf478accd41bc9cf5783e06e3625cd GIT binary patch literal 22147 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 Dq+%l3 literal 0 HcmV?d00001 diff --git a/cres/venv/lib/python3.8/site-packages/chardet/__pycache__/langhebrewmodel.cpython-38.pyc b/cres/venv/lib/python3.8/site-packages/chardet/__pycache__/langhebrewmodel.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a7a22683ef44d289162dbbf0d8b9986853f17dc7 GIT binary patch literal 22229 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 literal 0 HcmV?d00001 diff --git a/cres/venv/lib/python3.8/site-packages/chardet/__pycache__/langthaimodel.cpython-38.pyc b/cres/venv/lib/python3.8/site-packages/chardet/__pycache__/langthaimodel.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f064f1ffc794357827c1ca12e52384858f739950 GIT binary patch literal 22208 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 literal 0 HcmV?d00001 diff --git a/cres/venv/lib/python3.8/site-packages/chardet/__pycache__/langturkishmodel.cpython-38.pyc b/cres/venv/lib/python3.8/site-packages/chardet/__pycache__/langturkishmodel.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8bec7daede1d28b89a765cd9c07db74b84240150 GIT binary patch literal 22231 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 literal 0 HcmV?d00001 diff --git a/cres/venv/lib/python3.8/site-packages/chardet/__pycache__/mbcssm.cpython-38.pyc b/cres/venv/lib/python3.8/site-packages/chardet/__pycache__/mbcssm.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ca4ff15997ea9f5eb321266c0e4575634dcfe1d GIT binary patch literal 16766 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 ZH4w_Hy@!QOzQ^8^V;h4Y82x6fe*s_RS0MlZ literal 0 HcmV?d00001 diff --git a/cres/venv/lib/python3.8/site-packages/chardet/__pycache__/universaldetector.cpython-38.pyc b/cres/venv/lib/python3.8/site-packages/chardet/__pycache__/universaldetector.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8f1adae780eb4f192d4b7e9ce25d910208c8ce62 GIT binary patch literal 5843 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 literal 0 HcmV?d00001 diff --git a/cres/venv/lib/python3.8/site-packages/chardet/__pycache__/version.cpython-38.pyc b/cres/venv/lib/python3.8/site-packages/chardet/__pycache__/version.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..308ecd00bbde7dec2e985e9628b8bebeae85d113 GIT binary patch literal 451 zcmYjOJx{|h6ijGJQBYUrH_{<7QW;Q%P=#P%DTo3?2O=kaX$*-S*-k_IYhYwU;@@OL z`~yZN+%JhIy|Yg5hP(59x9dB0KKfseKlc4zlK<1PWN23(SYXb?VeZ65_jQNuyt$JW zYmJ?rxA^q$GOnSJtjZDag=?chihK@6g62h;^K=dhjp8`tVhSchn4!{K3J_HhqXL;i zl2OIb_^FZw)ZAoTfJRf5VL1mX7_1H(73eB1Y4S{`s6*c$(8^>|4d8+bIM1nA$>5Mt z5yo3OoEDVlVIqs3zi9Wvqwu(K!%@#`I#I-A5=G5^6m5)I($?0wX*v&=x8tkp(YvE| zZ4E2 +# +# 128 --> 0.42261 +# 256 --> 0.57851 +# 512 --> 0.74851 +# 1024 --> 0.89384 +# 2048 --> 0.97583 +# +# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98 +# Random Distribution Ration = 512/(5401-512)=0.105 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + +BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75 + +#Char to FreqOrder table +BIG5_TABLE_SIZE = 5376 + +BIG5_CHAR_TO_FREQ_ORDER = ( + 1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, # 16 +3814, 33,3274, 261, 76, 44,2114, 16,2946,2187,1176, 659,3971, 26,3451,2653, # 32 +1198,3972,3350,4202, 410,2215, 302, 590, 361,1964, 8, 204, 58,4510,5009,1932, # 48 + 63,5010,5011, 317,1614, 75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, # 64 +3682, 3, 10,3973,1471, 29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, # 80 +4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947, 34,3556,3204, 64, 604, # 96 +5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337, 72, 406,5017, 80, # 112 + 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449, 69,2987, 591, # 128 + 179,2096, 471, 115,2035,1844, 60, 50,2988, 134, 806,1869, 734,2036,3454, 180, # 144 + 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, # 160 +2502, 90,2716,1338, 663, 11, 906,1099,2553, 20,2441, 182, 532,1716,5019, 732, # 176 +1376,4204,1311,1420,3206, 25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, # 192 +3276, 475,1447,3683,5020, 117, 21, 656, 810,1297,2300,2334,3557,5021, 126,4205, # 208 + 706, 456, 150, 613,4513, 71,1118,2037,4206, 145,3092, 85, 835, 486,2115,1246, # 224 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, # 240 +3558,3135,5023,1956,1153,4207, 83, 296,1199,3093, 192, 624, 93,5024, 822,1898, # 256 +2823,3136, 795,2065, 991,1554,1542,1592, 27, 43,2867, 859, 139,1456, 860,4514, # 272 + 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, # 288 +3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, # 304 +1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, # 320 +5026,5027,2176,3207,3685,2682, 593, 845,1062,3277, 88,1723,2038,3978,1951, 212, # 336 + 266, 152, 149, 468,1899,4208,4516, 77, 187,5028,3038, 37, 5,2990,5029,3979, # 352 +5030,5031, 39,2524,4517,2908,3208,2079, 55, 148, 74,4518, 545, 483,1474,1029, # 368 +1665, 217,1870,1531,3138,1104,2655,4209, 24, 172,3562, 900,3980,3563,3564,4519, # 384 + 32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683, 4,3039,3351,1427,1789, # 400 + 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, # 416 +3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439, 38,5037,1063,5038, 794, # 432 +3982,1435,2301, 46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804, 35, 707, # 448 + 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, # 464 +2129,1363,3689,1423, 697, 100,3094, 48, 70,1231, 495,3139,2196,5043,1294,5044, # 480 +2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, # 496 + 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, # 512 + 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, # 528 +3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, # 544 +1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, # 560 +1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, # 576 +1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381, 7, # 592 +2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, # 608 + 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, # 624 +4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, # 640 +1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, # 656 +5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, # 672 +2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, # 688 + 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, # 704 + 98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, # 720 + 523,2789,2790,2658,5061, 141,2235,1333, 68, 176, 441, 876, 907,4220, 603,2602, # 736 + 710, 171,3464, 404, 549, 18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, # 752 +5063,2991, 368,5064, 146, 366, 99, 871,3693,1543, 748, 807,1586,1185, 22,2263, # 768 + 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, # 784 +1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068, 59,5069, # 800 + 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, # 816 + 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, # 832 +5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, # 848 +1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, # 864 + 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, # 880 +3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, # 896 +4224, 57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, # 912 +3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, # 928 + 279,3145, 51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, # 944 + 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, # 960 +1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, # 976 +4227,2475,1436, 953,4228,2055,4545, 671,2400, 79,4229,2446,3285, 608, 567,2689, # 992 +3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008 +3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024 +2402,5097,5098,5099,4232,3045, 0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040 +5101, 233,4233,3697,1819,4550,4551,5102, 96,1777,1315,2083,5103, 257,5104,1810, # 1056 +3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072 +5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088 +1484,5110,1712, 127, 67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104 +2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120 +1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136 + 78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152 +1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168 +4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184 +3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200 + 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216 + 165, 243,4559,3703,2528, 123, 683,4239, 764,4560, 36,3998,1793, 589,2916, 816, # 1232 + 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248 +2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264 +5122, 611,1156, 854,2386,1316,2875, 2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280 +1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296 +2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312 +1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328 +1994,5135,4564,5136,5137,2198, 13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344 +5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360 +5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376 +5149, 128,2133, 92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392 +3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408 +4567,2252, 94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424 +4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440 +2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456 +5163,2337,2068, 23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472 +3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488 + 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504 +5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863, 41, # 1520 +5170,5171,4575,5172,1657,2338, 19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536 +1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552 +2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568 +3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584 +4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600 +5182,2692, 733, 40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616 +3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632 +4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648 +1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664 +1871,2762,3004,5187, 435,5188, 343,1108, 596, 17,1751,4579,2239,3477,3709,5189, # 1680 +4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696 +1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712 + 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728 +1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744 +1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760 +3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776 + 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792 +5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808 +2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824 +1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840 +1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551, 30,2268,4266, # 1856 +5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872 + 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888 +4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904 + 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920 +2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936 + 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952 +1041,3005, 293,1168, 87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968 +1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984 + 730,1515, 184,2840, 66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000 +4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016 +4021,5231,5232,1186, 15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032 +1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048 +3596,1342,1681,1718, 766,3297, 286, 89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064 +5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080 +5240,3298, 310, 313,3482,2304, 770,4278, 54,3054, 189,4611,3105,3848,4025,5241, # 2096 +1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112 +2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128 +1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144 +3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160 +2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176 +3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192 +2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208 +4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224 +4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240 +3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256 + 97, 81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272 +3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288 + 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304 +3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320 +4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336 +3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352 +1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368 +5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384 + 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400 +5286, 587, 14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416 +1702,1226, 102,1547, 62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432 + 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448 +4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294, 86,1494,1730, # 2464 +4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480 + 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496 +2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512 +2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885, 28,2695, # 2528 +3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544 +1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560 +4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576 +2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592 +1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608 +1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624 +2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640 +3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656 +1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672 +5313,3493,5314,5315,5316,3310,2698,1433,3311, 131, 95,1504,4049, 723,4303,3166, # 2688 +1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704 +4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654, 53,5320,3014,5321, # 2720 +1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736 + 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752 +1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768 +4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784 +4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800 +2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816 +1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832 +4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848 + 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864 +5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880 +2322,3316,5346,5347,4308,5348,4309, 84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896 +3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912 +4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928 + 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944 +5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960 +5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976 +1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992 +4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008 +4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024 +2699,1516,3614,1121,1082,1329,3317,4073,1449,3873, 65,1128,2848,2927,2769,1590, # 3040 +3874,5370,5371, 12,2668, 45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056 +3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072 +2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088 +1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104 +4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120 +3736,1859, 91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136 +3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152 +2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168 +4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771, 61,4079,3738,1823,4080, # 3184 +5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200 +3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216 +2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232 +3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248 +1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264 +2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280 +3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296 +4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063, 56,1396,3113, # 3312 +2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328 +2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344 +5418,1076, 49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360 +1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376 +2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392 +1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408 +3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424 +4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629, 31,2851, # 3440 +2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456 +3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472 +3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488 +2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504 +4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520 +2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536 +3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552 +4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568 +5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584 +3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600 + 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616 +1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412, 42,3119, 464,5455,2642, # 3632 +4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648 +1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664 +4701,5462,3020, 962, 588,3629, 289,3250,2644,1116, 52,5463,3067,1797,5464,5465, # 3680 +5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696 + 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712 +5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728 +5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744 +2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760 +3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776 +2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792 +2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808 + 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824 +1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840 +4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856 +3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872 +3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888 + 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904 +2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920 + 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936 +2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952 +4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968 +1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984 +4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000 +1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016 +3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032 + 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048 +3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064 +5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080 +5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096 +3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112 +3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128 +1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144 +2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160 +5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176 +1561,2674,1452,4113,1375,5549,5550, 47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192 +1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208 +3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224 + 919,2352,2975,2353,1270,4727,4115, 73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240 +1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256 +4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272 +5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288 +2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304 +3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320 + 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336 +1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352 +2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368 +2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384 +5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400 +5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416 +5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432 +2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448 +2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464 +1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480 +4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496 +3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512 +3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528 +4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544 +4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560 +2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576 +2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592 +5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608 +4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624 +5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640 +4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656 + 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672 + 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688 +1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704 +3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720 +4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736 +1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752 +5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768 +2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784 +2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800 +3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816 +5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832 +1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848 +3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864 +5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880 +1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896 +5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912 +2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928 +3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944 +2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960 +3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976 +3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992 +3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008 +4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024 + 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040 +2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056 +4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072 +3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088 +5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104 +1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120 +5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136 + 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152 +1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168 + 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184 +4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200 +1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216 +4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232 +1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248 + 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264 +3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280 +4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296 +5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312 + 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328 +3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344 + 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360 +2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376 +) + diff --git a/cres/venv/lib/python3.8/site-packages/chardet/big5prober.py b/cres/venv/lib/python3.8/site-packages/chardet/big5prober.py new file mode 100644 index 000000000..98f997012 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet/big5prober.py @@ -0,0 +1,47 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import Big5DistributionAnalysis +from .mbcssm import BIG5_SM_MODEL + + +class Big5Prober(MultiByteCharSetProber): + def __init__(self): + super(Big5Prober, self).__init__() + self.coding_sm = CodingStateMachine(BIG5_SM_MODEL) + self.distribution_analyzer = Big5DistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "Big5" + + @property + def language(self): + return "Chinese" diff --git a/cres/venv/lib/python3.8/site-packages/chardet/chardistribution.py b/cres/venv/lib/python3.8/site-packages/chardet/chardistribution.py new file mode 100644 index 000000000..c0395f4a4 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet/chardistribution.py @@ -0,0 +1,233 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .euctwfreq import (EUCTW_CHAR_TO_FREQ_ORDER, EUCTW_TABLE_SIZE, + EUCTW_TYPICAL_DISTRIBUTION_RATIO) +from .euckrfreq import (EUCKR_CHAR_TO_FREQ_ORDER, EUCKR_TABLE_SIZE, + EUCKR_TYPICAL_DISTRIBUTION_RATIO) +from .gb2312freq import (GB2312_CHAR_TO_FREQ_ORDER, GB2312_TABLE_SIZE, + GB2312_TYPICAL_DISTRIBUTION_RATIO) +from .big5freq import (BIG5_CHAR_TO_FREQ_ORDER, BIG5_TABLE_SIZE, + BIG5_TYPICAL_DISTRIBUTION_RATIO) +from .jisfreq import (JIS_CHAR_TO_FREQ_ORDER, JIS_TABLE_SIZE, + JIS_TYPICAL_DISTRIBUTION_RATIO) + + +class CharDistributionAnalysis(object): + ENOUGH_DATA_THRESHOLD = 1024 + SURE_YES = 0.99 + SURE_NO = 0.01 + MINIMUM_DATA_THRESHOLD = 3 + + def __init__(self): + # Mapping table to get frequency order from char order (get from + # GetOrder()) + self._char_to_freq_order = None + self._table_size = None # Size of above table + # This is a constant value which varies from language to language, + # used in calculating confidence. See + # http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html + # for further detail. + self.typical_distribution_ratio = None + self._done = None + self._total_chars = None + self._freq_chars = None + self.reset() + + def reset(self): + """reset analyser, clear any state""" + # If this flag is set to True, detection is done and conclusion has + # been made + self._done = False + self._total_chars = 0 # Total characters encountered + # The number of characters whose frequency order is less than 512 + self._freq_chars = 0 + + def feed(self, char, char_len): + """feed a character with known length""" + if char_len == 2: + # we only care about 2-bytes character in our distribution analysis + order = self.get_order(char) + else: + order = -1 + if order >= 0: + self._total_chars += 1 + # order is valid + if order < self._table_size: + if 512 > self._char_to_freq_order[order]: + self._freq_chars += 1 + + def get_confidence(self): + """return confidence based on existing data""" + # if we didn't receive any character in our consideration range, + # return negative answer + if self._total_chars <= 0 or self._freq_chars <= self.MINIMUM_DATA_THRESHOLD: + return self.SURE_NO + + if self._total_chars != self._freq_chars: + r = (self._freq_chars / ((self._total_chars - self._freq_chars) + * self.typical_distribution_ratio)) + if r < self.SURE_YES: + return r + + # normalize confidence (we don't want to be 100% sure) + return self.SURE_YES + + def got_enough_data(self): + # It is not necessary to receive all data to draw conclusion. + # For charset detection, certain amount of data is enough + return self._total_chars > self.ENOUGH_DATA_THRESHOLD + + def get_order(self, byte_str): + # We do not handle characters based on the original encoding string, + # but convert this encoding string to a number, here called order. + # This allows multiple encodings of a language to share one frequency + # table. + return -1 + + +class EUCTWDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(EUCTWDistributionAnalysis, self).__init__() + self._char_to_freq_order = EUCTW_CHAR_TO_FREQ_ORDER + self._table_size = EUCTW_TABLE_SIZE + self.typical_distribution_ratio = EUCTW_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for euc-TW encoding, we are interested + # first byte range: 0xc4 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char = byte_str[0] + if first_char >= 0xC4: + return 94 * (first_char - 0xC4) + byte_str[1] - 0xA1 + else: + return -1 + + +class EUCKRDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(EUCKRDistributionAnalysis, self).__init__() + self._char_to_freq_order = EUCKR_CHAR_TO_FREQ_ORDER + self._table_size = EUCKR_TABLE_SIZE + self.typical_distribution_ratio = EUCKR_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for euc-KR encoding, we are interested + # first byte range: 0xb0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char = byte_str[0] + if first_char >= 0xB0: + return 94 * (first_char - 0xB0) + byte_str[1] - 0xA1 + else: + return -1 + + +class GB2312DistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(GB2312DistributionAnalysis, self).__init__() + self._char_to_freq_order = GB2312_CHAR_TO_FREQ_ORDER + self._table_size = GB2312_TABLE_SIZE + self.typical_distribution_ratio = GB2312_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for GB2312 encoding, we are interested + # first byte range: 0xb0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if (first_char >= 0xB0) and (second_char >= 0xA1): + return 94 * (first_char - 0xB0) + second_char - 0xA1 + else: + return -1 + + +class Big5DistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(Big5DistributionAnalysis, self).__init__() + self._char_to_freq_order = BIG5_CHAR_TO_FREQ_ORDER + self._table_size = BIG5_TABLE_SIZE + self.typical_distribution_ratio = BIG5_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for big5 encoding, we are interested + # first byte range: 0xa4 -- 0xfe + # second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if first_char >= 0xA4: + if second_char >= 0xA1: + return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63 + else: + return 157 * (first_char - 0xA4) + second_char - 0x40 + else: + return -1 + + +class SJISDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(SJISDistributionAnalysis, self).__init__() + self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER + self._table_size = JIS_TABLE_SIZE + self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for sjis encoding, we are interested + # first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe + # second byte range: 0x40 -- 0x7e, 0x81 -- oxfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if (first_char >= 0x81) and (first_char <= 0x9F): + order = 188 * (first_char - 0x81) + elif (first_char >= 0xE0) and (first_char <= 0xEF): + order = 188 * (first_char - 0xE0 + 31) + else: + return -1 + order = order + second_char - 0x40 + if second_char > 0x7F: + order = -1 + return order + + +class EUCJPDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(EUCJPDistributionAnalysis, self).__init__() + self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER + self._table_size = JIS_TABLE_SIZE + self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for euc-JP encoding, we are interested + # first byte range: 0xa0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + char = byte_str[0] + if char >= 0xA0: + return 94 * (char - 0xA1) + byte_str[1] - 0xa1 + else: + return -1 diff --git a/cres/venv/lib/python3.8/site-packages/chardet/charsetgroupprober.py b/cres/venv/lib/python3.8/site-packages/chardet/charsetgroupprober.py new file mode 100644 index 000000000..8b3738efd --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet/charsetgroupprober.py @@ -0,0 +1,106 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import ProbingState +from .charsetprober import CharSetProber + + +class CharSetGroupProber(CharSetProber): + def __init__(self, lang_filter=None): + super(CharSetGroupProber, self).__init__(lang_filter=lang_filter) + self._active_num = 0 + self.probers = [] + self._best_guess_prober = None + + def reset(self): + super(CharSetGroupProber, self).reset() + self._active_num = 0 + for prober in self.probers: + if prober: + prober.reset() + prober.active = True + self._active_num += 1 + self._best_guess_prober = None + + @property + def charset_name(self): + if not self._best_guess_prober: + self.get_confidence() + if not self._best_guess_prober: + return None + return self._best_guess_prober.charset_name + + @property + def language(self): + if not self._best_guess_prober: + self.get_confidence() + if not self._best_guess_prober: + return None + return self._best_guess_prober.language + + def feed(self, byte_str): + for prober in self.probers: + if not prober: + continue + if not prober.active: + continue + state = prober.feed(byte_str) + if not state: + continue + if state == ProbingState.FOUND_IT: + self._best_guess_prober = prober + return self.state + elif state == ProbingState.NOT_ME: + prober.active = False + self._active_num -= 1 + if self._active_num <= 0: + self._state = ProbingState.NOT_ME + return self.state + return self.state + + def get_confidence(self): + state = self.state + if state == ProbingState.FOUND_IT: + return 0.99 + elif state == ProbingState.NOT_ME: + return 0.01 + best_conf = 0.0 + self._best_guess_prober = None + for prober in self.probers: + if not prober: + continue + if not prober.active: + self.logger.debug('%s not active', prober.charset_name) + continue + conf = prober.get_confidence() + self.logger.debug('%s %s confidence = %s', prober.charset_name, prober.language, conf) + if best_conf < conf: + best_conf = conf + self._best_guess_prober = prober + if not self._best_guess_prober: + return 0.0 + return best_conf diff --git a/cres/venv/lib/python3.8/site-packages/chardet/charsetprober.py b/cres/venv/lib/python3.8/site-packages/chardet/charsetprober.py new file mode 100644 index 000000000..eac4e5986 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet/charsetprober.py @@ -0,0 +1,145 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import logging +import re + +from .enums import ProbingState + + +class CharSetProber(object): + + SHORTCUT_THRESHOLD = 0.95 + + def __init__(self, lang_filter=None): + self._state = None + self.lang_filter = lang_filter + self.logger = logging.getLogger(__name__) + + def reset(self): + self._state = ProbingState.DETECTING + + @property + def charset_name(self): + return None + + def feed(self, buf): + pass + + @property + def state(self): + return self._state + + def get_confidence(self): + return 0.0 + + @staticmethod + def filter_high_byte_only(buf): + buf = re.sub(b'([\x00-\x7F])+', b' ', buf) + return buf + + @staticmethod + def filter_international_words(buf): + """ + We define three types of bytes: + alphabet: english alphabets [a-zA-Z] + international: international characters [\x80-\xFF] + marker: everything else [^a-zA-Z\x80-\xFF] + + The input buffer can be thought to contain a series of words delimited + by markers. This function works to filter all words that contain at + least one international character. All contiguous sequences of markers + are replaced by a single space ascii character. + + This filter applies to all scripts which do not use English characters. + """ + filtered = bytearray() + + # This regex expression filters out only words that have at-least one + # international character. The word may include one marker character at + # the end. + words = re.findall(b'[a-zA-Z]*[\x80-\xFF]+[a-zA-Z]*[^a-zA-Z\x80-\xFF]?', + buf) + + for word in words: + filtered.extend(word[:-1]) + + # If the last character in the word is a marker, replace it with a + # space as markers shouldn't affect our analysis (they are used + # similarly across all languages and may thus have similar + # frequencies). + last_char = word[-1:] + if not last_char.isalpha() and last_char < b'\x80': + last_char = b' ' + filtered.extend(last_char) + + return filtered + + @staticmethod + def filter_with_english_letters(buf): + """ + Returns a copy of ``buf`` that retains only the sequences of English + alphabet and high byte characters that are not between <> characters. + Also retains English alphabet and high byte characters immediately + before occurrences of >. + + This filter can be applied to all scripts which contain both English + characters and extended ASCII characters, but is currently only used by + ``Latin1Prober``. + """ + filtered = bytearray() + in_tag = False + prev = 0 + + for curr in range(len(buf)): + # Slice here to get bytes instead of an int with Python 3 + buf_char = buf[curr:curr + 1] + # Check if we're coming out of or entering an HTML tag + if buf_char == b'>': + in_tag = False + elif buf_char == b'<': + in_tag = True + + # If current character is not extended-ASCII and not alphabetic... + if buf_char < b'\x80' and not buf_char.isalpha(): + # ...and we're not in a tag + if curr > prev and not in_tag: + # Keep everything after last non-extended-ASCII, + # non-alphabetic character + filtered.extend(buf[prev:curr]) + # Output a space to delimit stretch we kept + filtered.extend(b' ') + prev = curr + 1 + + # If we're not in a tag... + if not in_tag: + # Keep everything after last non-extended-ASCII, non-alphabetic + # character + filtered.extend(buf[prev:]) + + return filtered diff --git a/cres/venv/lib/python3.8/site-packages/chardet/cli/__init__.py b/cres/venv/lib/python3.8/site-packages/chardet/cli/__init__.py new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet/cli/__init__.py @@ -0,0 +1 @@ + diff --git a/cres/venv/lib/python3.8/site-packages/chardet/cli/chardetect.py b/cres/venv/lib/python3.8/site-packages/chardet/cli/chardetect.py new file mode 100644 index 000000000..f0a4cc5d7 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet/cli/chardetect.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python +""" +Script which takes one or more file paths and reports on their detected +encodings + +Example:: + + % chardetect somefile someotherfile + somefile: windows-1252 with confidence 0.5 + someotherfile: ascii with confidence 1.0 + +If no paths are provided, it takes its input from stdin. + +""" + +from __future__ import absolute_import, print_function, unicode_literals + +import argparse +import sys + +from chardet import __version__ +from chardet.compat import PY2 +from chardet.universaldetector import UniversalDetector + + +def description_of(lines, name='stdin'): + """ + Return a string describing the probable encoding of a file or + list of strings. + + :param lines: The lines to get the encoding of. + :type lines: Iterable of bytes + :param name: Name of file or collection of lines + :type name: str + """ + u = UniversalDetector() + for line in lines: + line = bytearray(line) + u.feed(line) + # shortcut out of the loop to save reading further - particularly useful if we read a BOM. + if u.done: + break + u.close() + result = u.result + if PY2: + name = name.decode(sys.getfilesystemencoding(), 'ignore') + if result['encoding']: + return '{0}: {1} with confidence {2}'.format(name, result['encoding'], + result['confidence']) + else: + return '{0}: no result'.format(name) + + +def main(argv=None): + """ + Handles command line arguments and gets things started. + + :param argv: List of arguments, as if specified on the command-line. + If None, ``sys.argv[1:]`` is used instead. + :type argv: list of str + """ + # Get command line arguments + parser = argparse.ArgumentParser( + description="Takes one or more file paths and reports their detected \ + encodings") + parser.add_argument('input', + help='File whose encoding we would like to determine. \ + (default: stdin)', + type=argparse.FileType('rb'), nargs='*', + default=[sys.stdin if PY2 else sys.stdin.buffer]) + parser.add_argument('--version', action='version', + version='%(prog)s {0}'.format(__version__)) + args = parser.parse_args(argv) + + for f in args.input: + if f.isatty(): + print("You are running chardetect interactively. Press " + + "CTRL-D twice at the start of a blank line to signal the " + + "end of your input. If you want help, run chardetect " + + "--help\n", file=sys.stderr) + print(description_of(f, f.name)) + + +if __name__ == '__main__': + main() diff --git a/cres/venv/lib/python3.8/site-packages/chardet/codingstatemachine.py b/cres/venv/lib/python3.8/site-packages/chardet/codingstatemachine.py new file mode 100644 index 000000000..68fba44f1 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet/codingstatemachine.py @@ -0,0 +1,88 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import logging + +from .enums import MachineState + + +class CodingStateMachine(object): + """ + A state machine to verify a byte sequence for a particular encoding. For + each byte the detector receives, it will feed that byte to every active + state machine available, one byte at a time. The state machine changes its + state based on its previous state and the byte it receives. There are 3 + states in a state machine that are of interest to an auto-detector: + + START state: This is the state to start with, or a legal byte sequence + (i.e. a valid code point) for character has been identified. + + ME state: This indicates that the state machine identified a byte sequence + that is specific to the charset it is designed for and that + there is no other possible encoding which can contain this byte + sequence. This will to lead to an immediate positive answer for + the detector. + + ERROR state: This indicates the state machine identified an illegal byte + sequence for that encoding. This will lead to an immediate + negative answer for this encoding. Detector will exclude this + encoding from consideration from here on. + """ + def __init__(self, sm): + self._model = sm + self._curr_byte_pos = 0 + self._curr_char_len = 0 + self._curr_state = None + self.logger = logging.getLogger(__name__) + self.reset() + + def reset(self): + self._curr_state = MachineState.START + + def next_state(self, c): + # for each byte we get its class + # if it is first byte, we also get byte length + byte_class = self._model['class_table'][c] + if self._curr_state == MachineState.START: + self._curr_byte_pos = 0 + self._curr_char_len = self._model['char_len_table'][byte_class] + # from byte's class and state_table, we get its next state + curr_state = (self._curr_state * self._model['class_factor'] + + byte_class) + self._curr_state = self._model['state_table'][curr_state] + self._curr_byte_pos += 1 + return self._curr_state + + def get_current_charlen(self): + return self._curr_char_len + + def get_coding_state_machine(self): + return self._model['name'] + + @property + def language(self): + return self._model['language'] diff --git a/cres/venv/lib/python3.8/site-packages/chardet/compat.py b/cres/venv/lib/python3.8/site-packages/chardet/compat.py new file mode 100644 index 000000000..ddd74687c --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet/compat.py @@ -0,0 +1,34 @@ +######################## BEGIN LICENSE BLOCK ######################## +# Contributor(s): +# Dan Blanchard +# Ian Cordasco +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import sys + + +if sys.version_info < (3, 0): + PY2 = True + PY3 = False + base_str = (str, unicode) + text_type = unicode +else: + PY2 = False + PY3 = True + base_str = (bytes, str) + text_type = str diff --git a/cres/venv/lib/python3.8/site-packages/chardet/cp949prober.py b/cres/venv/lib/python3.8/site-packages/chardet/cp949prober.py new file mode 100644 index 000000000..efd793abc --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet/cp949prober.py @@ -0,0 +1,49 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .chardistribution import EUCKRDistributionAnalysis +from .codingstatemachine import CodingStateMachine +from .mbcharsetprober import MultiByteCharSetProber +from .mbcssm import CP949_SM_MODEL + + +class CP949Prober(MultiByteCharSetProber): + def __init__(self): + super(CP949Prober, self).__init__() + self.coding_sm = CodingStateMachine(CP949_SM_MODEL) + # NOTE: CP949 is a superset of EUC-KR, so the distribution should be + # not different. + self.distribution_analyzer = EUCKRDistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "CP949" + + @property + def language(self): + return "Korean" diff --git a/cres/venv/lib/python3.8/site-packages/chardet/enums.py b/cres/venv/lib/python3.8/site-packages/chardet/enums.py new file mode 100644 index 000000000..045120722 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet/enums.py @@ -0,0 +1,76 @@ +""" +All of the Enums that are used throughout the chardet package. + +:author: Dan Blanchard (dan.blanchard@gmail.com) +""" + + +class InputState(object): + """ + This enum represents the different states a universal detector can be in. + """ + PURE_ASCII = 0 + ESC_ASCII = 1 + HIGH_BYTE = 2 + + +class LanguageFilter(object): + """ + This enum represents the different language filters we can apply to a + ``UniversalDetector``. + """ + CHINESE_SIMPLIFIED = 0x01 + CHINESE_TRADITIONAL = 0x02 + JAPANESE = 0x04 + KOREAN = 0x08 + NON_CJK = 0x10 + ALL = 0x1F + CHINESE = CHINESE_SIMPLIFIED | CHINESE_TRADITIONAL + CJK = CHINESE | JAPANESE | KOREAN + + +class ProbingState(object): + """ + This enum represents the different states a prober can be in. + """ + DETECTING = 0 + FOUND_IT = 1 + NOT_ME = 2 + + +class MachineState(object): + """ + This enum represents the different states a state machine can be in. + """ + START = 0 + ERROR = 1 + ITS_ME = 2 + + +class SequenceLikelihood(object): + """ + This enum represents the likelihood of a character following the previous one. + """ + NEGATIVE = 0 + UNLIKELY = 1 + LIKELY = 2 + POSITIVE = 3 + + @classmethod + def get_num_categories(cls): + """:returns: The number of likelihood categories in the enum.""" + return 4 + + +class CharacterCategory(object): + """ + This enum represents the different categories language models for + ``SingleByteCharsetProber`` put characters into. + + Anything less than CONTROL is considered a letter. + """ + UNDEFINED = 255 + LINE_BREAK = 254 + SYMBOL = 253 + DIGIT = 252 + CONTROL = 251 diff --git a/cres/venv/lib/python3.8/site-packages/chardet/escprober.py b/cres/venv/lib/python3.8/site-packages/chardet/escprober.py new file mode 100644 index 000000000..c70493f2b --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet/escprober.py @@ -0,0 +1,101 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .codingstatemachine import CodingStateMachine +from .enums import LanguageFilter, ProbingState, MachineState +from .escsm import (HZ_SM_MODEL, ISO2022CN_SM_MODEL, ISO2022JP_SM_MODEL, + ISO2022KR_SM_MODEL) + + +class EscCharSetProber(CharSetProber): + """ + This CharSetProber uses a "code scheme" approach for detecting encodings, + whereby easily recognizable escape or shift sequences are relied on to + identify these encodings. + """ + + def __init__(self, lang_filter=None): + super(EscCharSetProber, self).__init__(lang_filter=lang_filter) + self.coding_sm = [] + if self.lang_filter & LanguageFilter.CHINESE_SIMPLIFIED: + self.coding_sm.append(CodingStateMachine(HZ_SM_MODEL)) + self.coding_sm.append(CodingStateMachine(ISO2022CN_SM_MODEL)) + if self.lang_filter & LanguageFilter.JAPANESE: + self.coding_sm.append(CodingStateMachine(ISO2022JP_SM_MODEL)) + if self.lang_filter & LanguageFilter.KOREAN: + self.coding_sm.append(CodingStateMachine(ISO2022KR_SM_MODEL)) + self.active_sm_count = None + self._detected_charset = None + self._detected_language = None + self._state = None + self.reset() + + def reset(self): + super(EscCharSetProber, self).reset() + for coding_sm in self.coding_sm: + if not coding_sm: + continue + coding_sm.active = True + coding_sm.reset() + self.active_sm_count = len(self.coding_sm) + self._detected_charset = None + self._detected_language = None + + @property + def charset_name(self): + return self._detected_charset + + @property + def language(self): + return self._detected_language + + def get_confidence(self): + if self._detected_charset: + return 0.99 + else: + return 0.00 + + def feed(self, byte_str): + for c in byte_str: + for coding_sm in self.coding_sm: + if not coding_sm or not coding_sm.active: + continue + coding_state = coding_sm.next_state(c) + if coding_state == MachineState.ERROR: + coding_sm.active = False + self.active_sm_count -= 1 + if self.active_sm_count <= 0: + self._state = ProbingState.NOT_ME + return self.state + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + self._detected_charset = coding_sm.get_coding_state_machine() + self._detected_language = coding_sm.language + return self.state + + return self.state diff --git a/cres/venv/lib/python3.8/site-packages/chardet/escsm.py b/cres/venv/lib/python3.8/site-packages/chardet/escsm.py new file mode 100644 index 000000000..0069523a0 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet/escsm.py @@ -0,0 +1,246 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import MachineState + +HZ_CLS = ( +1,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,0,0,0,0, # 20 - 27 +0,0,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,0,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,4,0,5,2,0, # 78 - 7f +1,1,1,1,1,1,1,1, # 80 - 87 +1,1,1,1,1,1,1,1, # 88 - 8f +1,1,1,1,1,1,1,1, # 90 - 97 +1,1,1,1,1,1,1,1, # 98 - 9f +1,1,1,1,1,1,1,1, # a0 - a7 +1,1,1,1,1,1,1,1, # a8 - af +1,1,1,1,1,1,1,1, # b0 - b7 +1,1,1,1,1,1,1,1, # b8 - bf +1,1,1,1,1,1,1,1, # c0 - c7 +1,1,1,1,1,1,1,1, # c8 - cf +1,1,1,1,1,1,1,1, # d0 - d7 +1,1,1,1,1,1,1,1, # d8 - df +1,1,1,1,1,1,1,1, # e0 - e7 +1,1,1,1,1,1,1,1, # e8 - ef +1,1,1,1,1,1,1,1, # f0 - f7 +1,1,1,1,1,1,1,1, # f8 - ff +) + +HZ_ST = ( +MachineState.START,MachineState.ERROR, 3,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START, 4,MachineState.ERROR,# 10-17 + 5,MachineState.ERROR, 6,MachineState.ERROR, 5, 5, 4,MachineState.ERROR,# 18-1f + 4,MachineState.ERROR, 4, 4, 4,MachineState.ERROR, 4,MachineState.ERROR,# 20-27 + 4,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 28-2f +) + +HZ_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) + +HZ_SM_MODEL = {'class_table': HZ_CLS, + 'class_factor': 6, + 'state_table': HZ_ST, + 'char_len_table': HZ_CHAR_LEN_TABLE, + 'name': "HZ-GB-2312", + 'language': 'Chinese'} + +ISO2022CN_CLS = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,0,0,0,0, # 20 - 27 +0,3,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,4,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022CN_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07 +MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f +MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17 +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,# 18-1f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 20-27 + 5, 6,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 28-2f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 30-37 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,# 38-3f +) + +ISO2022CN_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0) + +ISO2022CN_SM_MODEL = {'class_table': ISO2022CN_CLS, + 'class_factor': 9, + 'state_table': ISO2022CN_ST, + 'char_len_table': ISO2022CN_CHAR_LEN_TABLE, + 'name': "ISO-2022-CN", + 'language': 'Chinese'} + +ISO2022JP_CLS = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,2,2, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,7,0,0,0, # 20 - 27 +3,0,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +6,0,4,0,8,0,0,0, # 40 - 47 +0,9,5,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022JP_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07 +MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17 +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,# 18-1f +MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 20-27 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 6,MachineState.ITS_ME,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,# 28-2f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,# 30-37 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 38-3f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.START,# 40-47 +) + +ISO2022JP_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) + +ISO2022JP_SM_MODEL = {'class_table': ISO2022JP_CLS, + 'class_factor': 10, + 'state_table': ISO2022JP_ST, + 'char_len_table': ISO2022JP_CHAR_LEN_TABLE, + 'name': "ISO-2022-JP", + 'language': 'Japanese'} + +ISO2022KR_CLS = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,3,0,0,0, # 20 - 27 +0,4,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,5,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022KR_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 10-17 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 18-1f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 20-27 +) + +ISO2022KR_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) + +ISO2022KR_SM_MODEL = {'class_table': ISO2022KR_CLS, + 'class_factor': 6, + 'state_table': ISO2022KR_ST, + 'char_len_table': ISO2022KR_CHAR_LEN_TABLE, + 'name': "ISO-2022-KR", + 'language': 'Korean'} + + diff --git a/cres/venv/lib/python3.8/site-packages/chardet/eucjpprober.py b/cres/venv/lib/python3.8/site-packages/chardet/eucjpprober.py new file mode 100644 index 000000000..20ce8f7d1 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet/eucjpprober.py @@ -0,0 +1,92 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import ProbingState, MachineState +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCJPDistributionAnalysis +from .jpcntx import EUCJPContextAnalysis +from .mbcssm import EUCJP_SM_MODEL + + +class EUCJPProber(MultiByteCharSetProber): + def __init__(self): + super(EUCJPProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCJP_SM_MODEL) + self.distribution_analyzer = EUCJPDistributionAnalysis() + self.context_analyzer = EUCJPContextAnalysis() + self.reset() + + def reset(self): + super(EUCJPProber, self).reset() + self.context_analyzer.reset() + + @property + def charset_name(self): + return "EUC-JP" + + @property + def language(self): + return "Japanese" + + def feed(self, byte_str): + for i in range(len(byte_str)): + # PY3K: byte_str is a byte array, so byte_str[i] is an int, not a byte + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte_str[0] + self.context_analyzer.feed(self._last_char, char_len) + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.context_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if (self.context_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + context_conf = self.context_analyzer.get_confidence() + distrib_conf = self.distribution_analyzer.get_confidence() + return max(context_conf, distrib_conf) diff --git a/cres/venv/lib/python3.8/site-packages/chardet/euckrfreq.py b/cres/venv/lib/python3.8/site-packages/chardet/euckrfreq.py new file mode 100644 index 000000000..b68078cb9 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet/euckrfreq.py @@ -0,0 +1,195 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Sampling from about 20M text materials include literature and computer technology + +# 128 --> 0.79 +# 256 --> 0.92 +# 512 --> 0.986 +# 1024 --> 0.99944 +# 2048 --> 0.99999 +# +# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24 +# Random Distribution Ration = 512 / (2350-512) = 0.279. +# +# Typical Distribution Ratio + +EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0 + +EUCKR_TABLE_SIZE = 2352 + +# Char to FreqOrder table , +EUCKR_CHAR_TO_FREQ_ORDER = ( + 13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87, +1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398, +1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488, 20,1733,1269,1734, + 945,1400,1735, 47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739, + 116, 987, 813,1401, 683, 75,1204, 145,1740,1741,1742,1743, 16, 847, 667, 622, + 708,1744,1745,1746, 966, 787, 304, 129,1747, 60, 820, 123, 676,1748,1749,1750, +1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856, + 344,1763,1764,1765,1766, 89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205, + 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779, +1780, 337, 751,1058, 28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782, 19, +1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567, +1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797, +1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802, +1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899, + 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818, +1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409, +1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697, +1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770, +1412,1837,1838, 39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723, + 544,1023,1081, 869, 91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416, +1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300, + 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083, + 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857, +1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871, + 282, 96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420, +1421, 268,1877,1422,1878,1879,1880, 308,1881, 2, 537,1882,1883,1215,1884,1885, + 127, 791,1886,1273,1423,1887, 34, 336, 404, 643,1888, 571, 654, 894, 840,1889, + 0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893, +1894,1123, 48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317, +1899, 694,1900, 909, 734,1424, 572, 866,1425, 691, 85, 524,1010, 543, 394, 841, +1901,1902,1903,1026,1904,1905,1906,1907,1908,1909, 30, 451, 651, 988, 310,1910, +1911,1426, 810,1216, 93,1912,1913,1277,1217,1914, 858, 759, 45, 58, 181, 610, + 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375, +1919, 359,1920, 687,1921, 822,1922, 293,1923,1924, 40, 662, 118, 692, 29, 939, + 887, 640, 482, 174,1925, 69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870, + 217, 854,1163, 823,1927,1928,1929,1930, 834,1931, 78,1932, 859,1933,1063,1934, +1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888, +1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950, +1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065, +1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002, +1283,1222,1960,1961,1962,1963, 36, 383, 228, 753, 247, 454,1964, 876, 678,1965, +1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467, + 50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285, + 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971, 7, + 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979, +1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985, + 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994, +1995, 560, 223,1287, 98, 8, 189, 650, 978,1288,1996,1437,1997, 17, 345, 250, + 423, 277, 234, 512, 226, 97, 289, 42, 167,1998, 201,1999,2000, 843, 836, 824, + 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003, +2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008, 71,1440, 745, + 619, 688,2009, 829,2010,2011, 147,2012, 33, 948,2013,2014, 74, 224,2015, 61, + 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023, +2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591, 52, 724, 246,2031,2032, +2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912, +2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224, + 719,1170, 959, 440, 437, 534, 84, 388, 480,1131, 159, 220, 198, 679,2044,1012, + 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050, +2051,2052,2053, 59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681, + 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414, +1444,2064,2065, 41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068, +2069,1292,2070,2071,1445,2072,1446,2073,2074, 55, 588, 66,1447, 271,1092,2075, +1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850, +2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606, +2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449, +1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452, + 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112, +2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121, +2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130, + 22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174, 73,1096, 231, 274, + 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139, +2141,2142,2143,2144, 11, 374, 844,2145, 154,1232, 46,1461,2146, 838, 830, 721, +1233, 106,2147, 90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298, +2150,1462, 761, 565,2151, 686,2152, 649,2153, 72, 173,2154, 460, 415,2155,1463, +2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747, +2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177, 23, 530, 285, +2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187, +2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193, 10, +2194, 613, 424,2195, 979, 108, 449, 589, 27, 172, 81,1031, 80, 774, 281, 350, +1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201, +2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972, +2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219, +2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233, +2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242, +2243, 521, 486, 548,2244,2245,2246,1473,1300, 53, 549, 137, 875, 76, 158,2247, +1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178, +1475,2249, 82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255, +2256, 18, 450, 206,2257, 290, 292,1142,2258, 511, 162, 99, 346, 164, 735,2259, +1476,1477, 4, 554, 343, 798,1099,2260,1100,2261, 43, 171,1303, 139, 215,2262, +2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702, +1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272, 67,2273, + 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541, +2282,2283,2284,2285,2286, 70, 852,1071,2287,2288,2289,2290, 21, 56, 509, 117, + 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187, +2294,1046,1479,2295, 340,2296, 63,1047, 230,2297,2298,1305, 763,1306, 101, 800, + 808, 494,2299,2300,2301, 903,2302, 37,1072, 14, 5,2303, 79, 675,2304, 312, +2305,2306,2307,2308,2309,1480, 6,1307,2310,2311,2312, 1, 470, 35, 24, 229, +2313, 695, 210, 86, 778, 15, 784, 592, 779, 32, 77, 855, 964,2314, 259,2315, + 501, 380,2316,2317, 83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484, +2320,2321,2322,2323,2324,2325,1485,2326,2327, 128, 57, 68, 261,1048, 211, 170, +1240, 31,2328, 51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335, + 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601, +1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395, +2351,1490,1491, 62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354, +1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476, +2361,2362, 332, 12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035, + 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498, +2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310, +1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389, +2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504, +1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505, +2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145, +1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624, + 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700, +2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221, +2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377, + 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448, + 915, 489,2449,1514,1184,2450,2451, 515, 64, 427, 495,2452, 583,2453, 483, 485, +1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705, +1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465, + 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471, +2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997, +2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486, + 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187, 65,2494, + 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771, + 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323, +2499,2500, 49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491, + 95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510, + 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519, +2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532, +2533, 25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199, + 704, 504, 468, 758, 657,1528, 196, 44, 839,1246, 272, 750,2543, 765, 862,2544, +2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247, +1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441, + 249,1075,2556,2557,2558, 466, 743,2559,2560,2561, 92, 514, 426, 420, 526,2562, +2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362, +2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583, +2584,1532, 54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465, + 3, 458, 9, 38,2588, 107, 110, 890, 209, 26, 737, 498,2589,1534,2590, 431, + 202, 88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151, + 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596, +2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601, 94, 175, 197, 406, +2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611, +2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619, +1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628, +2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042, + 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642, # 512, 256 +) + diff --git a/cres/venv/lib/python3.8/site-packages/chardet/euckrprober.py b/cres/venv/lib/python3.8/site-packages/chardet/euckrprober.py new file mode 100644 index 000000000..345a060d0 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet/euckrprober.py @@ -0,0 +1,47 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCKRDistributionAnalysis +from .mbcssm import EUCKR_SM_MODEL + + +class EUCKRProber(MultiByteCharSetProber): + def __init__(self): + super(EUCKRProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCKR_SM_MODEL) + self.distribution_analyzer = EUCKRDistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "EUC-KR" + + @property + def language(self): + return "Korean" diff --git a/cres/venv/lib/python3.8/site-packages/chardet/euctwfreq.py b/cres/venv/lib/python3.8/site-packages/chardet/euctwfreq.py new file mode 100644 index 000000000..ed7a995a3 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet/euctwfreq.py @@ -0,0 +1,387 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# EUCTW frequency table +# Converted from big5 work +# by Taiwan's Mandarin Promotion Council +# + +# 128 --> 0.42261 +# 256 --> 0.57851 +# 512 --> 0.74851 +# 1024 --> 0.89384 +# 2048 --> 0.97583 +# +# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98 +# Random Distribution Ration = 512/(5401-512)=0.105 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + +EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75 + +# Char to FreqOrder table , +EUCTW_TABLE_SIZE = 5376 + +EUCTW_CHAR_TO_FREQ_ORDER = ( + 1,1800,1506, 255,1431, 198, 9, 82, 6,7310, 177, 202,3615,1256,2808, 110, # 2742 +3735, 33,3241, 261, 76, 44,2113, 16,2931,2184,1176, 659,3868, 26,3404,2643, # 2758 +1198,3869,3313,4060, 410,2211, 302, 590, 361,1963, 8, 204, 58,4296,7311,1931, # 2774 + 63,7312,7313, 317,1614, 75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, # 2790 +3616, 3, 10,3870,1471, 29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, # 2806 +4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932, 34,3501,3173, 64, 604, # 2822 +7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337, 72, 406,7319, 80, # 2838 + 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449, 69,2969, 591, # 2854 + 179,2095, 471, 115,2034,1843, 60, 50,2970, 134, 806,1868, 734,2035,3407, 180, # 2870 + 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, # 2886 +2495, 90,2707,1338, 663, 11, 906,1099,2545, 20,2436, 182, 532,1716,7321, 732, # 2902 +1376,4062,1311,1420,3175, 25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, # 2918 +3243, 475,1447,3617,7322, 117, 21, 656, 810,1297,2295,2329,3502,7323, 126,4063, # 2934 + 706, 456, 150, 613,4299, 71,1118,2036,4064, 145,3069, 85, 835, 486,2114,1246, # 2950 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, # 2966 +3503,3110,7325,1955,1153,4065, 83, 296,1199,3070, 192, 624, 93,7326, 822,1897, # 2982 +2810,3111, 795,2064, 991,1554,1542,1592, 27, 43,2853, 859, 139,1456, 860,4300, # 2998 + 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, # 3014 +3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, # 3030 +1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, # 3046 +7328,7329,2173,3176,3619,2673, 593, 845,1062,3244, 88,1723,2037,3875,1950, 212, # 3062 + 266, 152, 149, 468,1898,4066,4302, 77, 187,7330,3018, 37, 5,2972,7331,3876, # 3078 +7332,7333, 39,2517,4303,2894,3177,2078, 55, 148, 74,4304, 545, 483,1474,1029, # 3094 +1665, 217,1869,1531,3113,1104,2645,4067, 24, 172,3507, 900,3877,3508,3509,4305, # 3110 + 32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674, 4,3019,3314,1427,1788, # 3126 + 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, # 3142 +3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439, 38,7339,1063,7340, 794, # 3158 +3879,1435,2296, 46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804, 35, 707, # 3174 + 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, # 3190 +2128,1363,3623,1423, 697, 100,3071, 48, 70,1231, 495,3114,2193,7345,1294,7346, # 3206 +2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, # 3222 + 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, # 3238 + 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, # 3254 +3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, # 3270 +1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, # 3286 +1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, # 3302 +1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381, 7, # 3318 +2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, # 3334 + 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, # 3350 +4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, # 3366 +1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, # 3382 +7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, # 3398 +2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, # 3414 + 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, # 3430 + 98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, # 3446 + 523,2776,2777,2648,7364, 141,2231,1333, 68, 176, 441, 876, 907,4077, 603,2592, # 3462 + 710, 171,3417, 404, 549, 18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, # 3478 +7366,2973, 368,7367, 146, 366, 99, 871,3627,1543, 748, 807,1586,1185, 22,2258, # 3494 + 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, # 3510 +1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371, 59,7372, # 3526 + 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, # 3542 + 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, # 3558 +7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, # 3574 +1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, # 3590 + 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, # 3606 +3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, # 3622 +4081, 57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, # 3638 +3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, # 3654 + 279,3120, 51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, # 3670 + 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, # 3686 +1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, # 3702 +4084,2468,1436, 953,4085,2054,4331, 671,2395, 79,4086,2441,3252, 608, 567,2680, # 3718 +3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, # 3734 +3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, # 3750 +2397,7400,7401,7402,4089,3025, 0,7403,2469, 315, 231,2442, 301,3319,4335,2380, # 3766 +7404, 233,4090,3631,1818,4336,4337,7405, 96,1776,1315,2082,7406, 257,7407,1809, # 3782 +3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, # 3798 +7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, # 3814 +1484,7413,1712, 127, 67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, # 3830 +2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, # 3846 +1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, # 3862 + 78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, # 3878 +1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, # 3894 +4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, # 3910 +3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, # 3926 + 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, # 3942 + 165, 243,4345,3637,2521, 123, 683,4096, 764,4346, 36,3895,1792, 589,2902, 816, # 3958 + 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, # 3974 +2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, # 3990 +7425, 611,1156, 854,2381,1316,2861, 2, 386, 515,2904,7426,7427,3253, 868,2234, # 4006 +1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, # 4022 +2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, # 4038 +1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, # 4054 +1993,7438,4350,7439,7440,2195, 13,2779,3638,2980,3124,1229,1916,7441,3756,2131, # 4070 +7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, # 4086 +7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, # 4102 +7452, 128,2132, 92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, # 4118 +3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, # 4134 +4353,2248, 94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, # 4150 +1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, # 4166 +7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, # 4182 +2332,2067, 23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, # 4198 +7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, # 4214 +3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, # 4230 +3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863, 41,7473, # 4246 +7474,4361,7475,1657,2333, 19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, # 4262 +2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, # 4278 +7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, # 4294 + 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, # 4310 +4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, # 4326 +2683, 733, 40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, # 4342 +7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, # 4358 +3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, # 4374 +2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, # 4390 +2752,2986,7490, 435,7491, 343,1108, 596, 17,1751,4365,2235,3430,3643,7492,4366, # 4406 + 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, # 4422 +2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, # 4438 +1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, # 4454 +1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, # 4470 +2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, # 4486 +1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, # 4502 +7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, # 4518 +7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, # 4534 +2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, # 4550 +4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, # 4566 +1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551, 30,2263,4122, # 4582 +7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, # 4598 + 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, # 4614 +4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, # 4630 + 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, # 4646 +2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, # 4662 + 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, # 4678 +1041,2987, 293,1168, 87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, # 4694 +1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, # 4710 + 730,1515, 184,2827, 66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, # 4726 +3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, # 4742 +3918,7535,7536,1186, 15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, # 4758 +1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, # 4774 +3541,1342,1681,1718, 766,3264, 286, 89,2946,3649,7540,1713,7541,2597,3334,2990, # 4790 +7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, # 4806 +7544,3265, 310, 313,3435,2299, 770,4134, 54,3034, 189,4397,3082,3769,3922,7545, # 4822 +1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, # 4838 +2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, # 4854 +1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, # 4870 +3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, # 4886 +2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, # 4902 +3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, # 4918 +2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, # 4934 +4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, # 4950 +4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, # 4966 +3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, # 4982 + 97, 81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, # 4998 +3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, # 5014 + 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, # 5030 +3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, # 5046 +3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, # 5062 +3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, # 5078 +1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, # 5094 +7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, # 5110 + 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, # 5126 +7590, 587, 14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, # 5142 +1702,1226, 102,1547, 62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, # 5158 + 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, # 5174 +4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598, 86,1494,1730, # 5190 +3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, # 5206 + 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, # 5222 +2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, # 5238 +2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885, 28,2686, # 5254 +3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, # 5270 +1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, # 5286 +4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, # 5302 +2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, # 5318 +1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, # 5334 +1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, # 5350 +2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, # 5366 +3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, # 5382 +1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, # 5398 +7617,3446,7618,7619,7620,3277,2689,1433,3278, 131, 95,1504,3946, 723,4159,3141, # 5414 +1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, # 5430 +4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654, 53,7624,2996,7625, # 5446 +1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, # 5462 + 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, # 5478 +1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, # 5494 +3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, # 5510 +3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, # 5526 +2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, # 5542 +1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, # 5558 +4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, # 5574 + 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, # 5590 +7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, # 5606 +2317,3283,7650,7651,4164,7652,4165, 84,4166, 112, 989,7653, 547,1059,3961, 701, # 5622 +3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, # 5638 +4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, # 5654 + 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, # 5670 +7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, # 5686 +7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, # 5702 +1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, # 5718 +4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, # 5734 +3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, # 5750 +2690,1516,3559,1121,1082,1329,3284,3970,1449,3794, 65,1128,2835,2913,2759,1590, # 5766 +3795,7674,7675, 12,2658, 45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, # 5782 +3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, # 5798 +2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, # 5814 +1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, # 5830 +4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, # 5846 +3670,1858, 91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, # 5862 +3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, # 5878 +2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, # 5894 +4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761, 61,3976,3672,1822,3977, # 5910 +7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, # 5926 +3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, # 5942 +2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, # 5958 +3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, # 5974 +1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, # 5990 +2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, # 6006 +3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, # 6022 +4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043, 56,1396,3090, # 6038 +2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, # 6054 +2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, # 6070 +7722,1076, 49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, # 6086 +1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, # 6102 +2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, # 6118 +1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, # 6134 +3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, # 6150 +4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629, 31,2838, # 6166 +2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, # 6182 +3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, # 6198 +3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, # 6214 +2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, # 6230 +4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, # 6246 +2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, # 6262 +3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, # 6278 +4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, # 6294 +7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, # 6310 +3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, # 6326 + 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, # 6342 +1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412, 42,3096, 464,7759,2632, # 6358 +4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, # 6374 +1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, # 6390 +4487,7766,3002, 962, 588,3574, 289,3219,2634,1116, 52,7767,3047,1796,7768,7769, # 6406 +7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, # 6422 + 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, # 6438 +7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, # 6454 +2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, # 6470 +1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, # 6486 +1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, # 6502 +3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, # 6518 + 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, # 6534 + 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, # 6550 + 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, # 6566 +3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, # 6582 +2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, # 6598 + 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, # 6614 +7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, # 6630 +1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, # 6646 +3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, # 6662 +7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, # 6678 +1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, # 6694 +7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, # 6710 +4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, # 6726 +1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, # 6742 +2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, # 6758 +2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, # 6774 +4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, # 6790 + 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, # 6806 + 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, # 6822 +3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, # 6838 +3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, # 6854 +1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, # 6870 +2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, # 6886 +7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, # 6902 +1561,2664,1452,4010,1375,7855,7856, 47,2959, 316,7857,1406,1591,2923,3156,7858, # 6918 +1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, # 6934 +3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, # 6950 + 919,2347,2960,2348,1270,4511,4012, 73,7862,7863, 647,7864,3228,2843,2255,1550, # 6966 +1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, # 6982 +4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, # 6998 +7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, # 7014 +2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, # 7030 +3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, # 7046 + 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, # 7062 +1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, # 7078 +2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, # 7094 +2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, # 7110 +7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, # 7126 +7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, # 7142 +7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, # 7158 +2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, # 7174 +2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, # 7190 +1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, # 7206 +4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, # 7222 +3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, # 7238 +3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, # 7254 +4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, # 7270 +4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, # 7286 +2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, # 7302 +2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, # 7318 +7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, # 7334 +4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, # 7350 +7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, # 7366 +2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, # 7382 +1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, # 7398 +3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, # 7414 +4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, # 7430 +2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, # 7446 + 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, # 7462 +2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, # 7478 +1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, # 7494 +2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, # 7510 +2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, # 7526 +4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, # 7542 +7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, # 7558 +1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, # 7574 +3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, # 7590 +7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, # 7606 +1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, # 7622 +8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, # 7638 +2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, # 7654 +8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, # 7670 +2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, # 7686 +2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, # 7702 +8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, # 7718 +8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, # 7734 +8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, # 7750 + 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, # 7766 +8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, # 7782 +4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, # 7798 +3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, # 7814 +8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, # 7830 +1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, # 7846 +8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, # 7862 + 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, # 7878 +1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, # 7894 + 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, # 7910 +4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, # 7926 +1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, # 7942 +4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, # 7958 +1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, # 7974 + 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, # 7990 +3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, # 8006 +4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, # 8022 +8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, # 8038 + 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, # 8054 +3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, # 8070 + 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, # 8086 +2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118, # 8102 +) + diff --git a/cres/venv/lib/python3.8/site-packages/chardet/euctwprober.py b/cres/venv/lib/python3.8/site-packages/chardet/euctwprober.py new file mode 100644 index 000000000..35669cc4d --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet/euctwprober.py @@ -0,0 +1,46 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCTWDistributionAnalysis +from .mbcssm import EUCTW_SM_MODEL + +class EUCTWProber(MultiByteCharSetProber): + def __init__(self): + super(EUCTWProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCTW_SM_MODEL) + self.distribution_analyzer = EUCTWDistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "EUC-TW" + + @property + def language(self): + return "Taiwan" diff --git a/cres/venv/lib/python3.8/site-packages/chardet/gb2312freq.py b/cres/venv/lib/python3.8/site-packages/chardet/gb2312freq.py new file mode 100644 index 000000000..697837bd9 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet/gb2312freq.py @@ -0,0 +1,283 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# GB2312 most frequently used character table +# +# Char to FreqOrder table , from hz6763 + +# 512 --> 0.79 -- 0.79 +# 1024 --> 0.92 -- 0.13 +# 2048 --> 0.98 -- 0.06 +# 6768 --> 1.00 -- 0.02 +# +# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79 +# Random Distribution Ration = 512 / (3755 - 512) = 0.157 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR + +GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9 + +GB2312_TABLE_SIZE = 3760 + +GB2312_CHAR_TO_FREQ_ORDER = ( +1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205, +2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842, +2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409, + 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670, +1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820, +1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585, + 152,1687,1539, 738,1559, 59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566, +1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850, 70,3285,2729,3534,3575, +2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853, +3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061, + 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155, +1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406, + 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816, +2534,1546,2393,2760, 737,2494, 13, 447, 245,2747, 38,2765,2129,2589,1079, 606, + 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023, +2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414, +1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513, +3195,4115,5627,2489,2991, 24,2065,2697,1087,2719, 48,1634, 315, 68, 985,2052, + 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570, +1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575, + 253,3099, 32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250, +2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506, +1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563, 26, +3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835, +1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686, +2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054, +1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894, + 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105, +3777,3657, 643,2298,1148,1779, 190, 989,3544, 414, 11,2135,2063,2979,1471, 403, +3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694, + 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873, +3651, 210, 33,1608,2516, 200,1520, 415, 102, 0,3389,1287, 817, 91,3299,2940, + 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687, 20,1819, 121, +1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648, +3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992, +2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680, 72, 842,1990, 212,1233, +1154,1586, 75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157, + 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807, +1910, 534, 529,3309,1721,1660, 274, 39,2827, 661,2670,1578, 925,3248,3815,1094, +4278,4901,4252, 41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258, + 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478, +3568, 194,5062, 15, 961,3870,1241,1192,2664, 66,5215,3260,2111,1295,1127,2152, +3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426, 53,2909, + 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272, +1272,2363, 284,1753,3679,4064,1695, 81, 815,2677,2757,2731,1386, 859, 500,4221, +2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252, +1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301, +1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254, + 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070, +3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461, +3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640, 67,2360, +4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124, + 296,3979,1739,1611,3684, 23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535, +3116, 17,1074, 467,2692,2201, 387,2922, 45,1326,3055,1645,3659,2817, 958, 243, +1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713, +1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071, +4046,3572,2399,1571,3281, 79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442, + 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946, + 814,4968,3487,1548,2644,1567,1285, 2, 295,2636, 97, 946,3576, 832, 141,4257, +3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180, +1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427, + 602,1525,2608,1605,1639,3175, 694,3064, 10, 465, 76,2000,4846,4208, 444,3781, +1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724, +2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844, 89, 937, + 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943, + 432, 445,2811, 206,4136,1472, 730, 349, 73, 397,2802,2547, 998,1637,1167, 789, + 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552, +3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246, +4996, 371,1575,2436,1621,2210, 984,4033,1734,2638, 16,4529, 663,2755,3255,1451, +3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310, + 750,2058, 165, 80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860, +2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297, +2357, 395,3740, 137,2075, 944,4089,2584,1267,3802, 62,1533,2285, 178, 176, 780, +2440, 201,3707, 590, 478,1560,4354,2117,1075, 30, 74,4643,4004,1635,1441,2745, + 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936, +2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032, + 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669, 43,2523,1657, + 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414, + 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976, +3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436, +2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254, +2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024, 40,3240,1536, +1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238, + 18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059, +2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741, + 90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447, + 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601, +1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269, +1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076, 46,4253,2873,1889,1894, + 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173, + 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994, +1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956, +2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437, +3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154, +2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240, +2269,2246,1446, 36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143, +2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634, +3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472, +1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906, 51, 369, 170,3541, +1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143, +2101,2730,2490, 82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312, +1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414, +3750,2289,2795, 813,3123,2610,1136,4368, 5,3391,4541,2174, 420, 429,1728, 754, +1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424, +1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302, +3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739, + 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004, +2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484, +1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739, +4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535, +1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641, +1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307, +3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573, +1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533, + 47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965, + 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096, 99, +1397,1769,2300,4428,1643,3455,1978,1757,3718,1440, 35,4879,3742,1296,4228,2280, + 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505, +1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012, +1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039, + 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982, +3708, 135,2131, 87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530, +4314, 9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392, +3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656, +2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220, +2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766, +1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535, +3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728, +2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338, +1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627, +1505,1911,1883,3526, 698,3629,3456,1833,1431, 746, 77,1261,2017,2296,1977,1885, + 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411, +2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671, +2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162, +3192,2910,2010, 140,2395,2859, 55,1082,2012,2901, 662, 419,2081,1438, 680,2774, +4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524, +3399, 98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346, + 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040, +3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188, +2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280, +1086,1974,2034, 630, 257,3338,2788,4903,1017, 86,4790, 966,2789,1995,1696,1131, + 259,3095,4188,1308, 179,1463,5257, 289,4107,1248, 42,3413,1725,2288, 896,1947, + 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970, +3034,3310, 540,2370,1562,1288,2990, 502,4765,1147, 4,1853,2708, 207, 294,2814, +4078,2902,2509, 684, 34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557, +2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997, +1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972, +1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369, + 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376, +1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196, 19, 941,3624,3480, +3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610, + 955,1089,3103,1053, 96, 88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128, + 642,4006, 903,2539,1877,2082, 596, 29,4066,1790, 722,2157, 130, 995,1569, 769, +1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445, 50, 625, 487,2207, + 57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392, +1783, 362, 8,3433,3422, 610,2793,3277,1390,1284,1654, 21,3823, 734, 367, 623, + 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782, +2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650, + 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478, +2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773, +2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007, +1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323, +1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598, +2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961, + 819,1541, 142,2284, 44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302, +1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409, +1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683, +2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191, +2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434, 92,1466,4920,2616, +3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302, +1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774, +4462, 64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147, + 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731, + 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464, +3264,2855,2722,1952,1029,2839,2467, 84,4383,2215, 820,1391,2015,2448,3672, 377, +1948,2168, 797,2545,3536,2578,2645, 94,2874,1678, 405,1259,3071, 771, 546,1315, + 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928, 14,2594, 557, +3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903, +1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060, +4031,2641,4067,3145,1870, 37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261, +1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092, +2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810, +1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708, + 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658, +1178,2639,2351, 93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871, +3341,1618,4126,2595,2334, 603, 651, 69, 701, 268,2662,3411,2555,1380,1606, 503, + 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229, +2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112, + 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504, +1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389, +1281, 52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169, 27, +1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542, +3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861, +2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845, +3891,2868,3621,2254, 58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700, +3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469, +3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582, + 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999, +2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274, + 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020, +2724,1927,2333,4440, 567, 22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601, + 12, 974,3783,4391, 951,1412, 1,3720, 453,4608,4041, 528,1041,1027,3230,2628, +1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040, 31, + 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668, + 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778, +1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169, +3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667, +3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118, 63,2076, 314,1881, +1348,1061, 172, 978,3515,1747, 532, 511,3970, 6, 601, 905,2699,3300,1751, 276, +1467,3725,2668, 65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320, +3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751, +2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432, +2754, 95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772, +1985, 244,2546, 474, 495,1046,2611,1851,2061, 71,2089,1675,2590, 742,3758,2843, +3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116, + 451, 3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904, +4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652, +1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664, +2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078, 49,3770, +3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283, +3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626, +1197,1663,4476,3127, 85,4240,2528, 25,1111,1181,3673, 407,3470,4561,2679,2713, + 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333, + 391,2963, 187, 61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062, +2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555, + 931, 317,2517,3027, 325, 569, 686,2107,3084, 60,1042,1333,2794, 264,3177,4014, +1628, 258,3712, 7,4464,1176,1043,1778, 683, 114,1975, 78,1492, 383,1886, 510, + 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015, +1282,1289,4609, 697,1453,3044,2666,3611,1856,2412, 54, 719,1330, 568,3778,2459, +1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390, +1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238, +1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421, 56,1908,1640,2387,2232, +1917,1874,2477,4921, 148, 83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624, + 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189, + 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483, #last 512 +) + diff --git a/cres/venv/lib/python3.8/site-packages/chardet/gb2312prober.py b/cres/venv/lib/python3.8/site-packages/chardet/gb2312prober.py new file mode 100644 index 000000000..8446d2dd9 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet/gb2312prober.py @@ -0,0 +1,46 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import GB2312DistributionAnalysis +from .mbcssm import GB2312_SM_MODEL + +class GB2312Prober(MultiByteCharSetProber): + def __init__(self): + super(GB2312Prober, self).__init__() + self.coding_sm = CodingStateMachine(GB2312_SM_MODEL) + self.distribution_analyzer = GB2312DistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "GB2312" + + @property + def language(self): + return "Chinese" diff --git a/cres/venv/lib/python3.8/site-packages/chardet/hebrewprober.py b/cres/venv/lib/python3.8/site-packages/chardet/hebrewprober.py new file mode 100644 index 000000000..b0e1bf492 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet/hebrewprober.py @@ -0,0 +1,292 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Shy Shalom +# Portions created by the Initial Developer are Copyright (C) 2005 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState + +# This prober doesn't actually recognize a language or a charset. +# It is a helper prober for the use of the Hebrew model probers + +### General ideas of the Hebrew charset recognition ### +# +# Four main charsets exist in Hebrew: +# "ISO-8859-8" - Visual Hebrew +# "windows-1255" - Logical Hebrew +# "ISO-8859-8-I" - Logical Hebrew +# "x-mac-hebrew" - ?? Logical Hebrew ?? +# +# Both "ISO" charsets use a completely identical set of code points, whereas +# "windows-1255" and "x-mac-hebrew" are two different proper supersets of +# these code points. windows-1255 defines additional characters in the range +# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific +# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6. +# x-mac-hebrew defines similar additional code points but with a different +# mapping. +# +# As far as an average Hebrew text with no diacritics is concerned, all four +# charsets are identical with respect to code points. Meaning that for the +# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters +# (including final letters). +# +# The dominant difference between these charsets is their directionality. +# "Visual" directionality means that the text is ordered as if the renderer is +# not aware of a BIDI rendering algorithm. The renderer sees the text and +# draws it from left to right. The text itself when ordered naturally is read +# backwards. A buffer of Visual Hebrew generally looks like so: +# "[last word of first line spelled backwards] [whole line ordered backwards +# and spelled backwards] [first word of first line spelled backwards] +# [end of line] [last word of second line] ... etc' " +# adding punctuation marks, numbers and English text to visual text is +# naturally also "visual" and from left to right. +# +# "Logical" directionality means the text is ordered "naturally" according to +# the order it is read. It is the responsibility of the renderer to display +# the text from right to left. A BIDI algorithm is used to place general +# punctuation marks, numbers and English text in the text. +# +# Texts in x-mac-hebrew are almost impossible to find on the Internet. From +# what little evidence I could find, it seems that its general directionality +# is Logical. +# +# To sum up all of the above, the Hebrew probing mechanism knows about two +# charsets: +# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are +# backwards while line order is natural. For charset recognition purposes +# the line order is unimportant (In fact, for this implementation, even +# word order is unimportant). +# Logical Hebrew - "windows-1255" - normal, naturally ordered text. +# +# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be +# specifically identified. +# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew +# that contain special punctuation marks or diacritics is displayed with +# some unconverted characters showing as question marks. This problem might +# be corrected using another model prober for x-mac-hebrew. Due to the fact +# that x-mac-hebrew texts are so rare, writing another model prober isn't +# worth the effort and performance hit. +# +#### The Prober #### +# +# The prober is divided between two SBCharSetProbers and a HebrewProber, +# all of which are managed, created, fed data, inquired and deleted by the +# SBCSGroupProber. The two SBCharSetProbers identify that the text is in +# fact some kind of Hebrew, Logical or Visual. The final decision about which +# one is it is made by the HebrewProber by combining final-letter scores +# with the scores of the two SBCharSetProbers to produce a final answer. +# +# The SBCSGroupProber is responsible for stripping the original text of HTML +# tags, English characters, numbers, low-ASCII punctuation characters, spaces +# and new lines. It reduces any sequence of such characters to a single space. +# The buffer fed to each prober in the SBCS group prober is pure text in +# high-ASCII. +# The two SBCharSetProbers (model probers) share the same language model: +# Win1255Model. +# The first SBCharSetProber uses the model normally as any other +# SBCharSetProber does, to recognize windows-1255, upon which this model was +# built. The second SBCharSetProber is told to make the pair-of-letter +# lookup in the language model backwards. This in practice exactly simulates +# a visual Hebrew model using the windows-1255 logical Hebrew model. +# +# The HebrewProber is not using any language model. All it does is look for +# final-letter evidence suggesting the text is either logical Hebrew or visual +# Hebrew. Disjointed from the model probers, the results of the HebrewProber +# alone are meaningless. HebrewProber always returns 0.00 as confidence +# since it never identifies a charset by itself. Instead, the pointer to the +# HebrewProber is passed to the model probers as a helper "Name Prober". +# When the Group prober receives a positive identification from any prober, +# it asks for the name of the charset identified. If the prober queried is a +# Hebrew model prober, the model prober forwards the call to the +# HebrewProber to make the final decision. In the HebrewProber, the +# decision is made according to the final-letters scores maintained and Both +# model probers scores. The answer is returned in the form of the name of the +# charset identified, either "windows-1255" or "ISO-8859-8". + +class HebrewProber(CharSetProber): + # windows-1255 / ISO-8859-8 code points of interest + FINAL_KAF = 0xea + NORMAL_KAF = 0xeb + FINAL_MEM = 0xed + NORMAL_MEM = 0xee + FINAL_NUN = 0xef + NORMAL_NUN = 0xf0 + FINAL_PE = 0xf3 + NORMAL_PE = 0xf4 + FINAL_TSADI = 0xf5 + NORMAL_TSADI = 0xf6 + + # Minimum Visual vs Logical final letter score difference. + # If the difference is below this, don't rely solely on the final letter score + # distance. + MIN_FINAL_CHAR_DISTANCE = 5 + + # Minimum Visual vs Logical model score difference. + # If the difference is below this, don't rely at all on the model score + # distance. + MIN_MODEL_DISTANCE = 0.01 + + VISUAL_HEBREW_NAME = "ISO-8859-8" + LOGICAL_HEBREW_NAME = "windows-1255" + + def __init__(self): + super(HebrewProber, self).__init__() + self._final_char_logical_score = None + self._final_char_visual_score = None + self._prev = None + self._before_prev = None + self._logical_prober = None + self._visual_prober = None + self.reset() + + def reset(self): + self._final_char_logical_score = 0 + self._final_char_visual_score = 0 + # The two last characters seen in the previous buffer, + # mPrev and mBeforePrev are initialized to space in order to simulate + # a word delimiter at the beginning of the data + self._prev = ' ' + self._before_prev = ' ' + # These probers are owned by the group prober. + + def set_model_probers(self, logicalProber, visualProber): + self._logical_prober = logicalProber + self._visual_prober = visualProber + + def is_final(self, c): + return c in [self.FINAL_KAF, self.FINAL_MEM, self.FINAL_NUN, + self.FINAL_PE, self.FINAL_TSADI] + + def is_non_final(self, c): + # The normal Tsadi is not a good Non-Final letter due to words like + # 'lechotet' (to chat) containing an apostrophe after the tsadi. This + # apostrophe is converted to a space in FilterWithoutEnglishLetters + # causing the Non-Final tsadi to appear at an end of a word even + # though this is not the case in the original text. + # The letters Pe and Kaf rarely display a related behavior of not being + # a good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak' + # for example legally end with a Non-Final Pe or Kaf. However, the + # benefit of these letters as Non-Final letters outweighs the damage + # since these words are quite rare. + return c in [self.NORMAL_KAF, self.NORMAL_MEM, + self.NORMAL_NUN, self.NORMAL_PE] + + def feed(self, byte_str): + # Final letter analysis for logical-visual decision. + # Look for evidence that the received buffer is either logical Hebrew + # or visual Hebrew. + # The following cases are checked: + # 1) A word longer than 1 letter, ending with a final letter. This is + # an indication that the text is laid out "naturally" since the + # final letter really appears at the end. +1 for logical score. + # 2) A word longer than 1 letter, ending with a Non-Final letter. In + # normal Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi, + # should not end with the Non-Final form of that letter. Exceptions + # to this rule are mentioned above in isNonFinal(). This is an + # indication that the text is laid out backwards. +1 for visual + # score + # 3) A word longer than 1 letter, starting with a final letter. Final + # letters should not appear at the beginning of a word. This is an + # indication that the text is laid out backwards. +1 for visual + # score. + # + # The visual score and logical score are accumulated throughout the + # text and are finally checked against each other in GetCharSetName(). + # No checking for final letters in the middle of words is done since + # that case is not an indication for either Logical or Visual text. + # + # We automatically filter out all 7-bit characters (replace them with + # spaces) so the word boundary detection works properly. [MAP] + + if self.state == ProbingState.NOT_ME: + # Both model probers say it's not them. No reason to continue. + return ProbingState.NOT_ME + + byte_str = self.filter_high_byte_only(byte_str) + + for cur in byte_str: + if cur == ' ': + # We stand on a space - a word just ended + if self._before_prev != ' ': + # next-to-last char was not a space so self._prev is not a + # 1 letter word + if self.is_final(self._prev): + # case (1) [-2:not space][-1:final letter][cur:space] + self._final_char_logical_score += 1 + elif self.is_non_final(self._prev): + # case (2) [-2:not space][-1:Non-Final letter][ + # cur:space] + self._final_char_visual_score += 1 + else: + # Not standing on a space + if ((self._before_prev == ' ') and + (self.is_final(self._prev)) and (cur != ' ')): + # case (3) [-2:space][-1:final letter][cur:not space] + self._final_char_visual_score += 1 + self._before_prev = self._prev + self._prev = cur + + # Forever detecting, till the end or until both model probers return + # ProbingState.NOT_ME (handled above) + return ProbingState.DETECTING + + @property + def charset_name(self): + # Make the decision: is it Logical or Visual? + # If the final letter score distance is dominant enough, rely on it. + finalsub = self._final_char_logical_score - self._final_char_visual_score + if finalsub >= self.MIN_FINAL_CHAR_DISTANCE: + return self.LOGICAL_HEBREW_NAME + if finalsub <= -self.MIN_FINAL_CHAR_DISTANCE: + return self.VISUAL_HEBREW_NAME + + # It's not dominant enough, try to rely on the model scores instead. + modelsub = (self._logical_prober.get_confidence() + - self._visual_prober.get_confidence()) + if modelsub > self.MIN_MODEL_DISTANCE: + return self.LOGICAL_HEBREW_NAME + if modelsub < -self.MIN_MODEL_DISTANCE: + return self.VISUAL_HEBREW_NAME + + # Still no good, back to final letter distance, maybe it'll save the + # day. + if finalsub < 0.0: + return self.VISUAL_HEBREW_NAME + + # (finalsub > 0 - Logical) or (don't know what to do) default to + # Logical. + return self.LOGICAL_HEBREW_NAME + + @property + def language(self): + return 'Hebrew' + + @property + def state(self): + # Remain active as long as any of the model probers are active. + if (self._logical_prober.state == ProbingState.NOT_ME) and \ + (self._visual_prober.state == ProbingState.NOT_ME): + return ProbingState.NOT_ME + return ProbingState.DETECTING diff --git a/cres/venv/lib/python3.8/site-packages/chardet/jisfreq.py b/cres/venv/lib/python3.8/site-packages/chardet/jisfreq.py new file mode 100644 index 000000000..83fc082b5 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet/jisfreq.py @@ -0,0 +1,325 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Sampling from about 20M text materials include literature and computer technology +# +# Japanese frequency table, applied to both S-JIS and EUC-JP +# They are sorted in order. + +# 128 --> 0.77094 +# 256 --> 0.85710 +# 512 --> 0.92635 +# 1024 --> 0.97130 +# 2048 --> 0.99431 +# +# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58 +# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191 +# +# Typical Distribution Ratio, 25% of IDR + +JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0 + +# Char to FreqOrder table , +JIS_TABLE_SIZE = 4368 + +JIS_CHAR_TO_FREQ_ORDER = ( + 40, 1, 6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, # 16 +3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247, 18, 179,5071, 856,1661, # 32 +1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, # 48 +2042,1061,1062, 48, 49, 44, 45, 433, 434,1040,1041, 996, 787,2997,1255,4305, # 64 +2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, # 80 +5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, # 96 +1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, # 112 +5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, # 128 +5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, # 144 +5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, # 160 +5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, # 176 +5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, # 192 +5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, # 208 +1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, # 224 +1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, # 240 +1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, # 256 +2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, # 272 +3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161, 26,3377, 2,3929, 20, # 288 +3691, 47,4100, 50, 17, 16, 35, 268, 27, 243, 42, 155, 24, 154, 29, 184, # 304 + 4, 91, 14, 92, 53, 396, 33, 289, 9, 37, 64, 620, 21, 39, 321, 5, # 320 + 12, 11, 52, 13, 3, 208, 138, 0, 7, 60, 526, 141, 151,1069, 181, 275, # 336 +1591, 83, 132,1475, 126, 331, 829, 15, 69, 160, 59, 22, 157, 55,1079, 312, # 352 + 109, 38, 23, 25, 10, 19, 79,5195, 61, 382,1124, 8, 30,5196,5197,5198, # 368 +5199,5200,5201,5202,5203,5204,5205,5206, 89, 62, 74, 34,2416, 112, 139, 196, # 384 + 271, 149, 84, 607, 131, 765, 46, 88, 153, 683, 76, 874, 101, 258, 57, 80, # 400 + 32, 364, 121,1508, 169,1547, 68, 235, 145,2999, 41, 360,3027, 70, 63, 31, # 416 + 43, 259, 262,1383, 99, 533, 194, 66, 93, 846, 217, 192, 56, 106, 58, 565, # 432 + 280, 272, 311, 256, 146, 82, 308, 71, 100, 128, 214, 655, 110, 261, 104,1140, # 448 + 54, 51, 36, 87, 67,3070, 185,2618,2936,2020, 28,1066,2390,2059,5207,5208, # 464 +5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, # 480 +5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, # 496 +5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, # 512 +4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, # 528 +5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, # 544 +5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, # 560 +5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, # 576 +5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, # 592 +5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, # 608 +5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, # 624 +5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, # 640 +5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, # 656 +5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, # 672 +3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, # 688 +5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, # 704 +5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, # 720 +5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, # 736 +5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, # 752 +5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, # 768 +5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, # 784 +5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, # 800 +5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, # 816 +5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, # 832 +5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, # 848 +5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, # 864 +5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, # 880 +5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, # 896 +5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, # 912 +5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, # 928 +5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, # 944 +5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, # 960 +5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, # 976 +5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, # 992 +5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008 +5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024 +5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040 +5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056 +5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072 +5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088 +5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104 +5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120 +5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136 +5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152 +5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168 +5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184 +5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200 +5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216 +5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232 +5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248 +5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264 +5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280 +5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296 +6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312 +6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328 +6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344 +6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360 +6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376 +6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392 +6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408 +6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424 +4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440 + 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456 + 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472 +1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619, 65,3302,2045, # 1488 +1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504 + 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520 +3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536 +3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552 + 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568 +3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584 +3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600 + 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616 +2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632 + 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648 +3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664 +1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680 + 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696 +1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712 + 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728 +2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744 +2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760 +2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776 +2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792 +1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808 +1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824 +1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840 +1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856 +2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872 +1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888 +2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904 +1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920 +1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936 +1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952 +1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968 +1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984 +1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000 + 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016 + 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032 +1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048 +2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064 +2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080 +2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096 +3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112 +3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128 + 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144 +3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160 +1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876, 78,2287,1482,1277, # 2176 + 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192 +2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208 +1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224 + 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240 +3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256 +4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272 +2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288 +1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304 +2601,1919,1078, 75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320 +1075, 292,3818,1756,2602, 317, 98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336 + 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352 + 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368 +1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384 +2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400 +2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416 +2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432 +3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448 +1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464 +2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480 + 359,2291,1676, 73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496 + 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512 + 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528 +1209, 96, 587,2166,1032, 260,1072,2153, 173, 94, 226,3244, 819,2006,4642,4114, # 2544 +2203, 231,1744, 782, 97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560 + 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576 +1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592 +1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608 + 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624 +1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640 +1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656 +1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672 + 764,2861,1853, 688,2429,1920,1462, 77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688 +2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704 + 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720 +2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736 +3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752 +2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768 +1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784 +6147, 441, 762,1771,3447,3607,3608,1904, 840,3037, 86, 939,1385, 572,1370,2445, # 2800 +1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816 +2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832 +1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848 + 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864 + 72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880 +3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896 +3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912 +1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928 +1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944 +1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960 +1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976 + 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992 + 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008 +2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024 + 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040 +3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056 +2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072 + 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088 +1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104 +2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120 + 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136 +1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152 + 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168 +4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184 +2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200 +1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216 + 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232 +1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248 +2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264 + 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280 +6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296 +1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312 +1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328 +2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344 +3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360 + 914,2550,2587, 81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376 +3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392 +1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408 + 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424 +1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440 + 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456 +3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472 + 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488 +2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504 + 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520 +4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536 +2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552 +1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568 +1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584 +1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600 + 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616 +1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632 +3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648 +1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664 +3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680 + 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696 + 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712 + 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728 +2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744 +1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760 + 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776 +1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792 + 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808 +1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824 + 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840 + 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856 + 480,2083,1774,3458, 923,2279,1350, 221,3086, 85,2233,2234,3835,1585,3010,2147, # 3872 +1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888 +1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904 +2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920 +4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936 + 227,1351,1645,2453,2193,1421,2887, 812,2121, 634, 95,2435, 201,2312,4665,1646, # 3952 +1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968 + 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984 +1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000 +3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016 +1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032 +2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048 +2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064 +1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080 +1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096 +2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112 + 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128 +2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144 +1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160 +1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176 +1279,2136,1697,2335, 204, 721,2097,3838, 90,6186,2085,2505, 191,3967, 124,2148, # 4192 +1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208 +3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224 +2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240 +2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256 + 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272 +3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288 +3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304 +1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320 +2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336 +1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352 +2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368 #last 512 +) + + diff --git a/cres/venv/lib/python3.8/site-packages/chardet/jpcntx.py b/cres/venv/lib/python3.8/site-packages/chardet/jpcntx.py new file mode 100644 index 000000000..20044e4bc --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet/jpcntx.py @@ -0,0 +1,233 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + + +# This is hiragana 2-char sequence table, the number in each cell represents its frequency category +jp2CharContext = ( +(0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1), +(2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4), +(0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2), +(0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4), +(1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4), +(0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3), +(0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3), +(0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3), +(0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4), +(0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3), +(2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4), +(0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3), +(0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5), +(0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3), +(2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5), +(0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4), +(1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4), +(0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3), +(0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3), +(0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3), +(0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5), +(0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4), +(0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5), +(0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3), +(0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4), +(0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4), +(0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4), +(0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1), +(0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0), +(1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3), +(0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0), +(0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3), +(0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3), +(0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5), +(0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4), +(2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5), +(0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3), +(0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3), +(0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3), +(0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3), +(0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4), +(0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4), +(0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,2,0,0,0,0,0,0,2), +(0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3), +(0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3), +(0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3), +(0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3), +(0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4), +(0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3), +(0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4), +(0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3), +(0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,0,0,0,3), +(0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4), +(0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4), +(0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,2,3), +(2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4), +(0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4), +(0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3), +(0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4), +(0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4), +(1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4), +(0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3), +(0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2), +(0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2), +(0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3), +(0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3), +(0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5), +(0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3), +(0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4), +(1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4), +(0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1), +(0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2), +(0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3), +(0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1), +) + +class JapaneseContextAnalysis(object): + NUM_OF_CATEGORY = 6 + DONT_KNOW = -1 + ENOUGH_REL_THRESHOLD = 100 + MAX_REL_THRESHOLD = 1000 + MINIMUM_DATA_THRESHOLD = 4 + + def __init__(self): + self._total_rel = None + self._rel_sample = None + self._need_to_skip_char_num = None + self._last_char_order = None + self._done = None + self.reset() + + def reset(self): + self._total_rel = 0 # total sequence received + # category counters, each integer counts sequence in its category + self._rel_sample = [0] * self.NUM_OF_CATEGORY + # if last byte in current buffer is not the last byte of a character, + # we need to know how many bytes to skip in next buffer + self._need_to_skip_char_num = 0 + self._last_char_order = -1 # The order of previous char + # If this flag is set to True, detection is done and conclusion has + # been made + self._done = False + + def feed(self, byte_str, num_bytes): + if self._done: + return + + # The buffer we got is byte oriented, and a character may span in more than one + # buffers. In case the last one or two byte in last buffer is not + # complete, we record how many byte needed to complete that character + # and skip these bytes here. We can choose to record those bytes as + # well and analyse the character once it is complete, but since a + # character will not make much difference, by simply skipping + # this character will simply our logic and improve performance. + i = self._need_to_skip_char_num + while i < num_bytes: + order, char_len = self.get_order(byte_str[i:i + 2]) + i += char_len + if i > num_bytes: + self._need_to_skip_char_num = i - num_bytes + self._last_char_order = -1 + else: + if (order != -1) and (self._last_char_order != -1): + self._total_rel += 1 + if self._total_rel > self.MAX_REL_THRESHOLD: + self._done = True + break + self._rel_sample[jp2CharContext[self._last_char_order][order]] += 1 + self._last_char_order = order + + def got_enough_data(self): + return self._total_rel > self.ENOUGH_REL_THRESHOLD + + def get_confidence(self): + # This is just one way to calculate confidence. It works well for me. + if self._total_rel > self.MINIMUM_DATA_THRESHOLD: + return (self._total_rel - self._rel_sample[0]) / self._total_rel + else: + return self.DONT_KNOW + + def get_order(self, byte_str): + return -1, 1 + +class SJISContextAnalysis(JapaneseContextAnalysis): + def __init__(self): + super(SJISContextAnalysis, self).__init__() + self._charset_name = "SHIFT_JIS" + + @property + def charset_name(self): + return self._charset_name + + def get_order(self, byte_str): + if not byte_str: + return -1, 1 + # find out current char's byte length + first_char = byte_str[0] + if (0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC): + char_len = 2 + if (first_char == 0x87) or (0xFA <= first_char <= 0xFC): + self._charset_name = "CP932" + else: + char_len = 1 + + # return its order if it is hiragana + if len(byte_str) > 1: + second_char = byte_str[1] + if (first_char == 202) and (0x9F <= second_char <= 0xF1): + return second_char - 0x9F, char_len + + return -1, char_len + +class EUCJPContextAnalysis(JapaneseContextAnalysis): + def get_order(self, byte_str): + if not byte_str: + return -1, 1 + # find out current char's byte length + first_char = byte_str[0] + if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE): + char_len = 2 + elif first_char == 0x8F: + char_len = 3 + else: + char_len = 1 + + # return its order if it is hiragana + if len(byte_str) > 1: + second_char = byte_str[1] + if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3): + return second_char - 0xA1, char_len + + return -1, char_len + + diff --git a/cres/venv/lib/python3.8/site-packages/chardet/langbulgarianmodel.py b/cres/venv/lib/python3.8/site-packages/chardet/langbulgarianmodel.py new file mode 100644 index 000000000..2aa4fb2e2 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet/langbulgarianmodel.py @@ -0,0 +1,228 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +# this table is modified base on win1251BulgarianCharToOrderMap, so +# only number <64 is sure valid + +Latin5_BulgarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 +110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 +253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 +116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 +194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209, # 80 +210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225, # 90 + 81,226,227,228,229,230,105,231,232,233,234,235,236, 45,237,238, # a0 + 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # b0 + 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,239, 67,240, 60, 56, # c0 + 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # d0 + 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,241, 42, 16, # e0 + 62,242,243,244, 58,245, 98,246,247,248,249,250,251, 91,252,253, # f0 +) + +win1251BulgarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 +110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 +253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 +116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 +206,207,208,209,210,211,212,213,120,214,215,216,217,218,219,220, # 80 +221, 78, 64, 83,121, 98,117,105,222,223,224,225,226,227,228,229, # 90 + 88,230,231,232,233,122, 89,106,234,235,236,237,238, 45,239,240, # a0 + 73, 80,118,114,241,242,243,244,245, 62, 58,246,247,248,249,250, # b0 + 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # c0 + 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,251, 67,252, 60, 56, # d0 + 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # e0 + 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,253, 42, 16, # f0 +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 96.9392% +# first 1024 sequences:3.0618% +# rest sequences: 0.2992% +# negative sequences: 0.0020% +BulgarianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,2,2,1,2,2, +3,1,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,0,1, +0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,0,3,1,0, +0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,2,2,1,3,3,3,3,2,2,2,1,1,2,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,2,3,2,2,3,3,1,1,2,3,3,2,3,3,3,3,2,1,2,0,2,0,3,0,0, +0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,1,3,3,3,3,3,2,3,2,3,3,3,3,3,2,3,3,1,3,0,3,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,1,3,3,2,3,3,3,1,3,3,2,3,2,2,2,0,0,2,0,2,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,3,3,1,2,2,3,2,1,1,2,0,2,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,2,3,3,1,2,3,2,2,2,3,3,3,3,3,2,2,3,1,2,0,2,1,2,0,0, +0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,1,3,3,3,3,3,2,3,3,3,2,3,3,2,3,2,2,2,3,1,2,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,2,1,3,1,3,2,2,3,0,0,1,0,1,0,1,0,0, +0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,2,2,3,2,2,3,1,2,1,1,1,2,3,1,3,1,2,2,0,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,1,3,2,2,3,3,1,2,3,1,1,3,3,3,3,1,2,2,1,1,1,0,2,0,2,0,1, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,3,3,3,2,2,1,1,2,0,2,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,0,1,2,1,3,3,2,3,3,3,3,3,2,3,2,1,0,3,1,2,1,2,1,2,3,2,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,1,3,3,2,3,3,2,2,2,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,0,3,3,3,3,3,2,1,1,2,1,3,3,0,3,1,1,1,1,3,2,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,1,1,3,1,3,3,2,3,2,2,2,3,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,3,2,2,3,2,1,1,1,1,1,3,1,3,1,1,0,0,0,1,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,2,0,3,2,0,3,0,2,0,0,2,1,3,1,0,0,1,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,2,1,1,1,1,2,1,1,2,1,1,1,2,2,1,2,1,1,1,0,1,1,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,2,1,3,1,1,2,1,3,2,1,1,0,1,2,3,2,1,1,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,2,2,1,0,1,0,0,1,0,0,0,2,1,0,3,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,2,3,2,3,3,1,3,2,1,1,1,2,1,1,2,1,3,0,1,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,2,2,3,3,2,3,2,2,2,3,1,2,2,1,1,2,1,1,2,2,0,1,1,0,1,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,3,1,0,2,2,1,3,2,1,0,0,2,0,2,0,1,0,0,0,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,1,2,0,2,3,1,2,3,2,0,1,3,1,2,1,1,1,0,0,1,0,0,2,2,2,3, +2,2,2,2,1,2,1,1,2,2,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,1, +3,3,3,3,3,2,1,2,2,1,2,0,2,0,1,0,1,2,1,2,1,1,0,0,0,1,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,2,3,3,1,1,3,1,0,3,2,1,0,0,0,1,2,0,2,0,1,0,0,0,1,0,1,2,1,2,2, +1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,1,1,0,0, +3,1,0,1,0,2,3,2,2,2,3,2,2,2,2,2,1,0,2,1,2,1,1,1,0,1,2,1,2,2,2,1, +1,1,2,2,2,2,1,2,1,1,0,1,2,1,2,2,2,1,1,1,0,1,1,1,1,2,0,1,0,0,0,0, +2,3,2,3,3,0,0,2,1,0,2,1,0,0,0,0,2,3,0,2,0,0,0,0,0,1,0,0,2,0,1,2, +2,1,2,1,2,2,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,1,0,1,1,1,0,0,1,2,0,0, +3,3,2,2,3,0,2,3,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,1,0,1,2,0,2,2, +1,1,1,1,2,1,0,1,2,2,2,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,0, +2,3,2,3,3,0,0,3,0,1,1,0,1,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2, +2,2,1,1,1,1,1,2,2,2,1,0,2,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0, +3,3,3,3,2,2,2,2,2,0,2,1,1,1,1,2,1,2,1,1,0,2,0,1,0,1,0,0,2,0,1,2, +1,1,1,1,1,1,1,2,2,1,1,0,2,0,1,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,0,0, +2,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,0,1,2, +2,2,2,1,1,2,1,1,2,2,2,1,2,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0, +2,3,3,3,3,0,2,2,0,2,1,0,0,0,1,1,1,2,0,2,0,0,0,3,0,0,0,0,2,0,2,2, +1,1,1,2,1,2,1,1,2,2,2,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0, +2,3,3,3,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,1,2, +1,1,1,2,1,1,1,1,2,2,2,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0, +3,3,2,2,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,2, +1,1,1,1,1,2,1,1,2,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,0, +3,1,0,1,0,2,2,2,2,3,2,1,1,1,2,3,0,0,1,0,2,1,1,0,1,1,1,1,2,1,1,1, +1,2,2,1,2,1,2,2,1,1,0,1,2,1,2,2,1,1,1,0,0,1,1,1,2,1,0,1,0,0,0,0, +2,1,0,1,0,3,1,2,2,2,2,1,2,2,1,1,1,0,2,1,2,2,1,1,2,1,1,0,2,1,1,1, +1,2,2,2,2,2,2,2,1,2,0,1,1,0,2,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0, +2,1,1,1,1,2,2,2,2,1,2,2,2,1,2,2,1,1,2,1,2,3,2,2,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,3,2,0,1,2,0,1,2,1,1,0,1,0,1,2,1,2,0,0,0,1,1,0,0,0,1,0,0,2, +1,1,0,0,1,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0, +2,0,0,0,0,1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1, +1,2,2,2,2,1,1,2,1,2,1,1,1,0,2,1,2,1,1,1,0,2,1,1,1,1,0,1,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, +1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,3,2,0,0,0,0,1,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,2, +1,1,1,1,1,1,0,0,2,2,2,2,2,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1, +2,3,1,2,1,0,1,1,0,2,2,2,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,2, +1,1,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0, +2,2,2,2,2,0,0,2,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,2,2, +1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,2,0,1,1,0,0,0,1,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1, +0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,2, +1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,1,2,2,2,1,2,1,2,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,1,1,1,0,1,1, +1,1,2,1,1,1,1,1,1,0,0,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0, +1,0,0,1,3,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,1,0,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,1, +0,2,0,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,1,1,0,2,1,0,1,1,1,0,0,1,0,2,0,1,0,0,0,0,0,0,0,0,0,1, +0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,2,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, +0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,0,1,2,1,1,1,1,1,1,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0, +1,1,2,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +0,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, +1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,0,1, +1,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, +1,1,1,1,1,1,1,2,0,0,0,0,0,0,2,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +) + +Latin5BulgarianModel = { + 'char_to_order_map': Latin5_BulgarianCharToOrderMap, + 'precedence_matrix': BulgarianLangModel, + 'typical_positive_ratio': 0.969392, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-5", + 'language': 'Bulgairan', +} + +Win1251BulgarianModel = { + 'char_to_order_map': win1251BulgarianCharToOrderMap, + 'precedence_matrix': BulgarianLangModel, + 'typical_positive_ratio': 0.969392, + 'keep_english_letter': False, + 'charset_name': "windows-1251", + 'language': 'Bulgarian', +} diff --git a/cres/venv/lib/python3.8/site-packages/chardet/langcyrillicmodel.py b/cres/venv/lib/python3.8/site-packages/chardet/langcyrillicmodel.py new file mode 100644 index 000000000..e5f9a1fd1 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet/langcyrillicmodel.py @@ -0,0 +1,333 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# KOI8-R language model +# Character Mapping Table: +KOI8R_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, # 80 +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, # 90 +223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237, # a0 +238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253, # b0 + 27, 3, 21, 28, 13, 2, 39, 19, 26, 4, 23, 11, 8, 12, 5, 1, # c0 + 15, 16, 9, 7, 6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54, # d0 + 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34, # e0 + 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70, # f0 +) + +win1251_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +239,240,241,242,243,244,245,246, 68,247,248,249,250,251,252,253, + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +) + +latin5_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +) + +macCyrillic_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +239,240,241,242,243,244,245,246,247,248,249,250,251,252, 68, 16, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255, +) + +IBM855_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205, +206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70, + 3, 37, 21, 44, 28, 58, 13, 41, 2, 48, 39, 53, 19, 46,218,219, +220,221,222,223,224, 26, 55, 4, 42,225,226,227,228, 23, 60,229, +230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243, + 8, 49, 12, 38, 5, 31, 1, 34, 15,244,245,246,247, 35, 16,248, + 43, 9, 45, 7, 32, 6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249, +250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255, +) + +IBM866_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 97.6601% +# first 1024 sequences: 2.3389% +# rest sequences: 0.1237% +# negative sequences: 0.0009% +RussianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2, +3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,0,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,0,0,0,0,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,3,3,3,2,0,0,0,2,1,0,1,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1, +1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1, +1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0, +2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1, +1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0, +3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1, +1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0, +2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2, +1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1, +1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1, +1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1, +1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0, +3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2, +1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1, +2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1, +1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0, +2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1, +1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0, +1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1, +1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0, +3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1, +2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1, +3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1, +1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1, +1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1, +0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1, +1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0, +1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1, +0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1, +1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2, +2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1, +1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0, +1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0, +2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0, +1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1, +0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1, +1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1, +1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, +0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1, +0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1, +0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, +0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1, +0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, +2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0, +0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +) + +Koi8rModel = { + 'char_to_order_map': KOI8R_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "KOI8-R", + 'language': 'Russian', +} + +Win1251CyrillicModel = { + 'char_to_order_map': win1251_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "windows-1251", + 'language': 'Russian', +} + +Latin5CyrillicModel = { + 'char_to_order_map': latin5_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-5", + 'language': 'Russian', +} + +MacCyrillicModel = { + 'char_to_order_map': macCyrillic_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "MacCyrillic", + 'language': 'Russian', +} + +Ibm866Model = { + 'char_to_order_map': IBM866_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "IBM866", + 'language': 'Russian', +} + +Ibm855Model = { + 'char_to_order_map': IBM855_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "IBM855", + 'language': 'Russian', +} diff --git a/cres/venv/lib/python3.8/site-packages/chardet/langgreekmodel.py b/cres/venv/lib/python3.8/site-packages/chardet/langgreekmodel.py new file mode 100644 index 000000000..533222166 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet/langgreekmodel.py @@ -0,0 +1,225 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin7_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 + 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 +253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 + 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 +253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 +253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123, # b0 +110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 + 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 +124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 + 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 +) + +win1253_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 + 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 +253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 + 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 +253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 +253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123, # b0 +110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 + 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 +124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 + 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 98.2851% +# first 1024 sequences:1.7001% +# rest sequences: 0.0359% +# negative sequences: 0.0148% +GreekLangModel = ( +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0, +3,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0, +2,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0, +0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0, +2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0, +2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,3,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,2,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0, +0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,2,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0, +2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0, +0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0, +3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0, +3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0, +2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0, +2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,3,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0, +0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0, +0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0, +0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,0,0,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2, +0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0, +0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2, +0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0, +0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2, +0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,0,0,0,2,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2, +0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0, +0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2, +0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0, +0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0, +0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0, +0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,0,2,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0, +0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2, +0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,2,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2, +0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2, +0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2, +0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0, +0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1, +0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2, +0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2, +0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2, +0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0, +0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0, +0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1, +0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0, +0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0, +0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +Latin7GreekModel = { + 'char_to_order_map': Latin7_char_to_order_map, + 'precedence_matrix': GreekLangModel, + 'typical_positive_ratio': 0.982851, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-7", + 'language': 'Greek', +} + +Win1253GreekModel = { + 'char_to_order_map': win1253_char_to_order_map, + 'precedence_matrix': GreekLangModel, + 'typical_positive_ratio': 0.982851, + 'keep_english_letter': False, + 'charset_name': "windows-1253", + 'language': 'Greek', +} diff --git a/cres/venv/lib/python3.8/site-packages/chardet/langhebrewmodel.py b/cres/venv/lib/python3.8/site-packages/chardet/langhebrewmodel.py new file mode 100644 index 000000000..58f4c875e --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet/langhebrewmodel.py @@ -0,0 +1,200 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Simon Montagu +# Portions created by the Initial Developer are Copyright (C) 2005 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Shoshannah Forbes - original C code (?) +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Windows-1255 language model +# Character Mapping Table: +WIN1255_CHAR_TO_ORDER_MAP = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85, # 40 + 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253, # 50 +253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49, # 60 + 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253, # 70 +124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214, +215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221, + 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227, +106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234, + 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237, +238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250, + 9, 8, 20, 16, 3, 2, 24, 14, 22, 1, 25, 15, 4, 11, 6, 23, + 12, 19, 13, 26, 18, 27, 21, 17, 7, 10, 5,251,252,128, 96,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 98.4004% +# first 1024 sequences: 1.5981% +# rest sequences: 0.087% +# negative sequences: 0.0015% +HEBREW_LANG_MODEL = ( +0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0, +3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2, +1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2, +1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3, +1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2, +1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2, +1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2, +0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2, +0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2, +1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2, +0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1, +0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0, +0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2, +0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2, +0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2, +0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2, +0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1, +0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2, +0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2, +0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2, +0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2, +0,2,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0, +1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2, +0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3, +0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,0,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0, +0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0, +0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0, +2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,0,0,0,0, +0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0, +0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1, +1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1, +0,2,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1, +2,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1, +1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1, +2,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1, +2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0, +0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1, +0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0, +) + +Win1255HebrewModel = { + 'char_to_order_map': WIN1255_CHAR_TO_ORDER_MAP, + 'precedence_matrix': HEBREW_LANG_MODEL, + 'typical_positive_ratio': 0.984004, + 'keep_english_letter': False, + 'charset_name': "windows-1255", + 'language': 'Hebrew', +} diff --git a/cres/venv/lib/python3.8/site-packages/chardet/langhungarianmodel.py b/cres/venv/lib/python3.8/site-packages/chardet/langhungarianmodel.py new file mode 100644 index 000000000..bb7c095e1 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet/langhungarianmodel.py @@ -0,0 +1,225 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin2_HungarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, + 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, +253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, + 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, +159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174, +175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190, +191,192,193,194,195,196,197, 75,198,199,200,201,202,203,204,205, + 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, +221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231, +232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241, + 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85, +245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253, +) + +win1250HungarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, + 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, +253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, + 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, +161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176, +177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190, +191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205, + 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, +221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231, +232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241, + 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87, +245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 94.7368% +# first 1024 sequences:5.2623% +# rest sequences: 0.8894% +# negative sequences: 0.0009% +HungarianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, +3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,3,3,1,1,2,2,2,2,2,1,2, +3,2,2,3,3,3,3,3,2,3,3,3,3,3,3,1,2,3,3,3,3,2,3,3,1,1,3,3,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +3,2,1,3,3,3,3,3,2,3,3,3,3,3,1,1,2,3,3,3,3,3,3,3,1,1,3,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,1,1,2,3,3,3,1,3,3,3,3,3,1,3,3,2,2,0,3,2,3, +0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,3,3,2,3,3,2,2,3,2,3,2,0,3,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,1,2,3,2,2,3,1,2,3,3,2,2,0,3,3,3, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,0,2,3,2, +0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,2,1,3,2,2,3,2,1,3,2,2,1,0,3,3,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,2,2,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,3,2,2,3,1,1,3,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,1,3,3,3,3,3,2,2,1,3,3,3,0,1,1,2, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,0,3,2,3, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,1,3,2,2,2,3,1,1,3,3,1,1,0,3,3,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,2,3,3,3,3,3,1,2,3,2,2,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,1,3,3,2,2,1,3,3,3,1,1,3,1,2,3,2,3,2,2,2,1,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,2,2,3,2,1,0,3,2,0,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,1,0,3,3,3,3,0,2,3,0,0,2,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,2,2,2,2,3,3,0,1,2,3,2,3,2,2,3,2,1,2,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,3,3,3,3,3,1,2,3,3,3,2,1,2,3,3,2,2,2,3,2,3,3,1,3,3,1,1,0,2,3,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,1,2,2,2,2,3,3,3,1,1,1,3,3,1,1,3,1,1,3,2,1,2,3,1,1,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,1,2,1,1,3,3,1,1,1,1,3,3,1,1,2,2,1,2,1,1,2,2,1,1,0,2,2,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,1,1,2,1,1,3,3,1,0,1,1,3,3,2,0,1,1,2,3,1,0,2,2,1,0,0,1,3,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,2,1,3,3,3,3,3,1,2,3,2,3,3,2,1,1,3,2,3,2,1,2,2,0,1,2,1,0,0,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,2,2,2,2,3,1,2,2,1,1,3,3,0,3,2,1,2,3,2,1,3,3,1,1,0,2,1,3, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,2,3,3,3,2,1,1,3,3,1,1,1,2,2,3,2,3,2,2,2,1,0,2,2,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +1,0,0,3,3,3,3,3,0,0,3,3,2,3,0,0,0,2,3,3,1,0,1,2,0,0,1,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,2,3,3,3,3,3,1,2,3,3,2,2,1,1,0,3,3,2,2,1,2,2,1,0,2,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,2,1,3,1,2,3,3,2,2,1,1,2,2,1,1,1,1,3,2,1,1,1,1,2,1,0,1,2,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +2,3,3,1,1,1,1,1,3,3,3,0,1,1,3,3,1,1,1,1,1,2,2,0,3,1,1,2,0,2,1,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,1,0,1,2,1,2,2,0,1,2,3,1,2,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,0,0,0, +1,2,1,2,2,2,1,2,1,2,0,2,0,2,2,1,1,2,1,1,2,1,1,1,0,1,0,0,0,1,1,0, +1,1,1,2,3,2,3,3,0,1,2,2,3,1,0,1,0,2,1,2,2,0,1,1,0,0,1,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,3,3,2,2,1,0,0,3,2,3,2,0,0,0,1,1,3,0,0,1,1,0,0,2,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,2,2,3,3,1,0,1,3,2,3,1,1,1,0,1,1,1,1,1,3,1,0,0,2,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,1,2,2,2,1,0,1,2,3,3,2,0,0,0,2,1,1,1,2,1,1,1,0,1,1,1,0,0,0, +1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,0,0,1,1, +3,2,2,1,0,0,1,1,2,2,0,3,0,1,2,1,1,0,0,1,1,1,0,1,1,1,1,0,2,1,1,1, +2,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,1,2,3,1,1,1,1,1,1,1,1,1,0,1, +2,3,3,0,1,0,0,0,3,3,1,0,0,1,2,2,1,0,0,0,0,2,0,0,1,1,1,0,2,1,1,1, +2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,1,0,1, +2,3,3,0,1,0,0,0,2,2,0,0,0,0,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,1,0, +2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, +3,2,2,0,1,0,1,0,2,3,2,0,0,1,2,2,1,0,0,1,1,1,0,0,2,1,0,1,2,2,1,1, +2,1,1,1,1,1,1,2,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,1,0,1,1,2,1,1,0,1, +2,2,2,0,0,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,1,2,0,0,2,1,0,0,2,1,1,1, +2,1,1,1,1,2,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1, +1,2,3,0,0,0,1,0,3,2,1,0,0,1,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,2,1, +1,1,0,0,0,1,0,1,1,1,1,1,2,0,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,1, +3,0,0,2,1,2,2,1,0,0,2,1,2,2,0,0,0,2,1,1,1,0,1,1,0,0,1,1,2,0,0,0, +1,2,1,2,2,1,1,2,1,2,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1, +1,3,2,0,0,0,1,0,2,2,2,0,0,0,2,2,1,0,0,0,0,3,1,1,1,1,0,0,2,1,1,1, +2,1,0,1,1,1,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,1,0,1,1,1,1,1,1,0,1, +2,3,2,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,1,0, +2,1,1,1,1,2,1,2,1,2,0,1,1,1,0,2,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1, +3,1,1,2,2,2,3,2,1,1,2,2,1,1,0,1,0,2,2,1,1,1,1,1,0,0,1,1,0,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,0,0,0,0,0,2,2,0,0,0,0,2,2,1,0,0,0,1,1,0,0,1,2,0,0,2,1,1,1, +2,2,1,1,1,2,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,1,1,0,1,2,1,1,1,0,1, +1,0,0,1,2,3,2,1,0,0,2,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,0,0, +1,2,1,2,1,2,1,1,1,2,0,2,1,1,1,0,1,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0, +2,3,2,0,0,0,0,0,1,1,2,1,0,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,2,1,1,1, +2,1,1,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1, +1,2,2,0,1,1,1,0,2,2,2,0,0,0,3,2,1,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0, +1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,0,1,1,1,0,1,0,1, +2,1,0,2,1,1,2,2,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0, +1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0, +1,2,3,0,0,0,1,0,2,2,0,0,0,0,2,2,0,0,0,0,0,1,0,0,1,0,0,0,2,0,1,0, +2,1,1,1,1,1,0,2,0,0,0,1,2,1,1,1,1,0,1,2,0,1,0,1,0,1,1,1,0,1,0,1, +2,2,2,0,0,0,1,0,2,1,2,0,0,0,1,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,0,1, +2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, +1,2,2,0,0,0,1,0,2,2,2,0,0,0,1,1,0,0,0,0,0,1,1,0,2,0,0,1,1,1,0,1, +1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1, +1,0,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0, +0,2,1,2,1,1,1,1,1,2,0,2,0,1,1,0,1,2,1,0,1,1,1,0,0,0,0,0,0,1,0,0, +2,1,1,0,1,2,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,2,1,0,1, +2,2,1,1,1,1,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,0,1,0,1,1,1,1,1,0,1, +1,2,2,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,2,0,0,2,2,0,0,2,0,0,1, +2,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1, +1,1,2,0,0,3,1,0,2,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0, +1,2,1,0,1,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0, +2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2,0,0,0, +2,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,0,1, +2,1,1,1,2,1,1,1,0,1,1,2,1,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,0,1,1,1,1,1,0,0,1,1,2,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0, +1,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0, +2,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0, +0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,1,0,0,2,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0, +0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +0,0,0,1,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +2,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +) + +Latin2HungarianModel = { + 'char_to_order_map': Latin2_HungarianCharToOrderMap, + 'precedence_matrix': HungarianLangModel, + 'typical_positive_ratio': 0.947368, + 'keep_english_letter': True, + 'charset_name': "ISO-8859-2", + 'language': 'Hungarian', +} + +Win1250HungarianModel = { + 'char_to_order_map': win1250HungarianCharToOrderMap, + 'precedence_matrix': HungarianLangModel, + 'typical_positive_ratio': 0.947368, + 'keep_english_letter': True, + 'charset_name': "windows-1250", + 'language': 'Hungarian', +} diff --git a/cres/venv/lib/python3.8/site-packages/chardet/langthaimodel.py b/cres/venv/lib/python3.8/site-packages/chardet/langthaimodel.py new file mode 100644 index 000000000..15f94c2df --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet/langthaimodel.py @@ -0,0 +1,199 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# The following result for thai was collected from a limited sample (1M). + +# Character Mapping Table: +TIS620CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111, # 40 +188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253, # 50 +253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82, # 60 + 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253, # 70 +209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222, +223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235, +236, 5, 30,237, 24,238, 75, 8, 26, 52, 34, 51,119, 47, 58, 57, + 49, 53, 55, 43, 20, 19, 44, 14, 48, 3, 17, 25, 39, 62, 31, 54, + 45, 9, 16, 2, 61, 15,239, 12, 42, 46, 18, 21, 76, 4, 66, 63, + 22, 10, 1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244, + 11, 28, 41, 29, 33,245, 50, 37, 6, 7, 67, 77, 38, 93,246,247, + 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 92.6386% +# first 1024 sequences:7.3177% +# rest sequences: 1.0230% +# negative sequences: 0.0436% +ThaiLangModel = ( +0,1,3,3,3,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3,3,0,3,3,3,3, +0,3,3,0,0,0,1,3,0,3,3,2,3,3,0,1,2,3,3,3,3,0,2,0,2,0,0,3,2,1,2,2, +3,0,3,3,2,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,0,3,2,3,0,2,2,2,3, +0,2,3,0,0,0,0,1,0,1,2,3,1,1,3,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1, +3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,2,3,2,3,3,2,2,2, +3,1,2,3,0,3,3,2,2,1,2,3,3,1,2,0,1,3,0,1,0,0,1,0,0,0,0,0,0,0,1,1, +3,3,2,2,3,3,3,3,1,2,3,3,3,3,3,2,2,2,2,3,3,2,2,3,3,2,2,3,2,3,2,2, +3,3,1,2,3,1,2,2,3,3,1,0,2,1,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,1,0,1, +3,3,3,3,3,3,2,2,3,3,3,3,2,3,2,2,3,3,2,2,3,2,2,2,2,1,1,3,1,2,1,1, +3,2,1,0,2,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,3,2,3,2,3,3,2,2,3,2,3,3,2,3,1,1,2,3,2,2,2,3,2,2,2,2,2,1,2,1, +2,2,1,1,3,3,2,1,0,1,2,2,0,1,3,0,0,0,1,1,0,0,0,0,0,2,3,0,0,2,1,1, +3,3,2,3,3,2,0,0,3,3,0,3,3,0,2,2,3,1,2,2,1,1,1,0,2,2,2,0,2,2,1,1, +0,2,1,0,2,0,0,2,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,2,3,3,2,0,0,3,3,0,2,3,0,2,1,2,2,2,2,1,2,0,0,2,2,2,0,2,2,1,1, +0,2,1,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,2,3,2,3,2,0,2,2,1,3,2,1,3,2,1,2,3,2,2,3,0,2,3,2,2,1,2,2,2,2, +1,2,2,0,0,0,0,2,0,1,2,0,1,1,1,0,1,0,3,1,1,0,0,0,0,0,0,0,0,0,1,0, +3,3,2,3,3,2,3,2,2,2,3,2,2,3,2,2,1,2,3,2,2,3,1,3,2,2,2,3,2,2,2,3, +3,2,1,3,0,1,1,1,0,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,2,0,0, +1,0,0,3,0,3,3,3,3,3,0,0,3,0,2,2,3,3,3,3,3,0,0,0,1,1,3,0,0,0,0,2, +0,0,1,0,0,0,0,0,0,0,2,3,0,0,0,3,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +2,0,3,3,3,3,0,0,2,3,0,0,3,0,3,3,2,3,3,3,3,3,0,0,3,3,3,0,0,0,3,3, +0,0,3,0,0,0,0,2,0,0,2,1,1,3,0,0,1,0,0,2,3,0,1,0,0,0,0,0,0,0,1,0, +3,3,3,3,2,3,3,3,3,3,3,3,1,2,1,3,3,2,2,1,2,2,2,3,1,1,2,0,2,1,2,1, +2,2,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0, +3,0,2,1,2,3,3,3,0,2,0,2,2,0,2,1,3,2,2,1,2,1,0,0,2,2,1,0,2,1,2,2, +0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,3,3,1,1,3,0,2,3,1,1,3,2,1,1,2,0,2,2,3,2,1,1,1,1,1,2, +3,0,0,1,3,1,2,1,2,0,3,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +3,3,1,1,3,2,3,3,3,1,3,2,1,3,2,1,3,2,2,2,2,1,3,3,1,2,1,3,1,2,3,0, +2,1,1,3,2,2,2,1,2,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, +3,3,2,3,2,3,3,2,3,2,3,2,3,3,2,1,0,3,2,2,2,1,2,2,2,1,2,2,1,2,1,1, +2,2,2,3,0,1,3,1,1,1,1,0,1,1,0,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,3,2,2,1,1,3,2,3,2,3,2,0,3,2,2,1,2,0,2,2,2,1,2,2,2,2,1, +3,2,1,2,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,2,3,1,2,3,3,2,2,3,0,1,1,2,0,3,3,2,2,3,0,1,1,3,0,0,0,0, +3,1,0,3,3,0,2,0,2,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,3,2,3,3,0,1,3,1,1,2,1,2,1,1,3,1,1,0,2,3,1,1,1,1,1,1,1,1, +3,1,1,2,2,2,2,1,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,2,2,1,1,2,1,3,3,2,3,2,2,3,2,2,3,1,2,2,1,2,0,3,2,1,2,2,2,2,2,1, +3,2,1,2,2,2,1,1,1,1,0,0,1,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,1,3,3,0,2,1,0,3,2,0,0,3,1,0,1,1,0,1,0,0,0,0,0,1, +1,0,0,1,0,3,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,2,2,2,3,0,0,1,3,0,3,2,0,3,2,2,3,3,3,3,3,1,0,2,2,2,0,2,2,1,2, +0,2,3,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,0,2,3,1,3,3,2,3,3,0,3,3,0,3,2,2,3,2,3,3,3,0,0,2,2,3,0,1,1,1,3, +0,0,3,0,0,0,2,2,0,1,3,0,1,2,2,2,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1, +3,2,3,3,2,0,3,3,2,2,3,1,3,2,1,3,2,0,1,2,2,0,2,3,2,1,0,3,0,0,0,0, +3,0,0,2,3,1,3,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,3,2,2,2,1,2,0,1,3,1,1,3,1,3,0,0,2,1,1,1,1,2,1,1,1,0,2,1,0,1, +1,2,0,0,0,3,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0, +3,3,3,3,2,2,2,2,2,1,3,1,1,1,2,0,1,1,2,1,2,1,3,2,0,0,3,1,1,1,1,1, +3,1,0,2,3,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,2,3,0,3,3,0,2,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,3,1,3,0,0,1,2,0,0,2,0,3,3,2,3,3,3,2,3,0,0,2,2,2,0,0,0,2,2, +0,0,1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,1,2,3,1,3,3,0,0,1,0,3,0,0,0,0,0, +0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,1,2,3,1,2,3,1,0,3,0,2,2,1,0,2,1,1,2,0,1,0,0,1,1,1,1,0,1,0,0, +1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,0,1,1,1,3,1,2,2,2,2,2,2,1,1,1,1,0,3,1,0,1,3,1,1,1,1, +1,1,0,2,0,1,3,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1, +3,0,2,2,1,3,3,2,3,3,0,1,1,0,2,2,1,2,1,3,3,1,0,0,3,2,0,0,0,0,2,1, +0,1,0,0,0,0,1,2,0,1,1,3,1,1,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,3,0,0,1,0,0,0,3,0,0,3,0,3,1,0,1,1,1,3,2,0,0,0,3,0,0,0,0,2,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,1,3,2,1,3,3,1,2,2,0,1,2,1,0,1,2,0,0,0,0,0,3,0,0,0,3,0,0,0,0, +3,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,2,0,3,3,3,2,2,0,1,1,0,1,3,0,0,0,2,2,0,0,0,0,3,1,0,1,0,0,0, +0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,2,3,1,2,0,0,2,1,0,3,1,0,1,2,0,1,1,1,1,3,0,0,3,1,1,0,2,2,1,1, +0,2,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,3,1,2,0,0,2,2,0,1,2,0,1,0,1,3,1,2,1,0,0,0,2,0,3,0,0,0,1,0, +0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,1,2,2,0,0,0,2,0,2,1,0,1,1,0,1,1,1,2,1,0,0,1,1,1,0,2,1,1,1, +0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1, +0,0,0,2,0,1,3,1,1,1,1,0,0,0,0,3,2,0,1,0,0,0,1,2,0,0,0,1,0,0,0,0, +0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,2,3,2,2,0,0,0,1,0,0,0,0,2,3,2,1,2,2,3,0,0,0,2,3,1,0,0,0,1,1, +0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0, +3,3,2,2,0,1,0,0,0,0,2,0,2,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,1,1,0,0, +0,1,0,2,0,0,1,0,3,0,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,1,0,0,1,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,0,0,0,0,1,1,0,0, +0,1,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0, +3,3,1,1,1,1,2,3,0,0,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,0,1,2,1,1,0,1, +2,1,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,3,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1, +0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,0,0,0,0,1,2,1,0,1,1,0,2,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,2,0,0,0,1,3,0,1,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,0, +3,3,0,0,1,1,2,0,0,1,2,1,0,1,1,1,0,1,1,0,0,2,1,1,0,1,0,0,1,1,1,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,1,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0, +1,0,0,1,0,1,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,3,0,0,0,0,1,1,0,0,0,0,0,0,0,3, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,1,0,0,2,0,0,2,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0, +1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,3,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0, +1,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,1,0,0,2,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +TIS620ThaiModel = { + 'char_to_order_map': TIS620CharToOrderMap, + 'precedence_matrix': ThaiLangModel, + 'typical_positive_ratio': 0.926386, + 'keep_english_letter': False, + 'charset_name': "TIS-620", + 'language': 'Thai', +} diff --git a/cres/venv/lib/python3.8/site-packages/chardet/langturkishmodel.py b/cres/venv/lib/python3.8/site-packages/chardet/langturkishmodel.py new file mode 100644 index 000000000..a427a4573 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet/langturkishmodel.py @@ -0,0 +1,193 @@ +# -*- coding: utf-8 -*- +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Özgür Baskın - Turkish Language Model +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin5_TurkishCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255, 23, 37, 47, 39, 29, 52, 36, 45, 53, 60, 16, 49, 20, 46, 42, + 48, 69, 44, 35, 31, 51, 38, 62, 65, 43, 56,255,255,255,255,255, +255, 1, 21, 28, 12, 2, 18, 27, 25, 3, 24, 10, 5, 13, 4, 15, + 26, 64, 7, 8, 9, 14, 32, 57, 58, 11, 22,255,255,255,255,255, +180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165, +164,163,162,161,160,159,101,158,157,156,155,154,153,152,151,106, +150,149,148,147,146,145,144,100,143,142,141,140,139,138,137,136, + 94, 80, 93,135,105,134,133, 63,132,131,130,129,128,127,126,125, +124,104, 73, 99, 79, 85,123, 54,122, 98, 92,121,120, 91,103,119, + 68,118,117, 97,116,115, 50, 90,114,113,112,111, 55, 41, 40, 86, + 89, 70, 59, 78, 71, 82, 88, 33, 77, 66, 84, 83,110, 75, 61, 96, + 30, 67,109, 74, 87,102, 34, 95, 81,108, 76, 72, 17, 6, 19,107, +) + +TurkishLangModel = ( +3,2,3,3,3,1,3,3,3,3,3,3,3,3,2,1,1,3,3,1,3,3,0,3,3,3,3,3,0,3,1,3, +3,2,1,0,0,1,1,0,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, +3,2,2,3,3,0,3,3,3,3,3,3,3,2,3,1,0,3,3,1,3,3,0,3,3,3,3,3,0,3,0,3, +3,1,1,0,1,0,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,0,1,0,1, +3,3,2,3,3,0,3,3,3,3,3,3,3,2,3,1,1,3,3,0,3,3,1,2,3,3,3,3,0,3,0,3, +3,1,1,0,0,0,1,0,0,0,0,1,1,0,1,2,1,0,0,0,1,0,0,0,0,2,0,0,0,0,0,1, +3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,1,3,3,2,0,3,2,1,2,2,1,3,3,0,0,0,2, +2,2,0,1,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,0,1, +3,3,3,2,3,3,1,2,3,3,3,3,3,3,3,1,3,2,1,0,3,2,0,1,2,3,3,2,1,0,0,2, +2,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,0,0, +1,0,1,3,3,1,3,3,3,3,3,3,3,1,2,0,0,2,3,0,2,3,0,0,2,2,2,3,0,3,0,1, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,0,3,2,0,2,3,2,3,3,1,0,0,2, +3,2,0,0,1,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,2,0,0,1, +3,3,3,2,3,3,2,3,3,3,3,2,3,3,3,0,3,3,0,0,2,1,0,0,2,3,2,2,0,0,0,2, +2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,0,1,0,2,0,0,1, +3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,0,1,3,2,1,1,3,2,3,2,1,0,0,2, +2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, +3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,2,0,2,3,0,0,2,2,2,2,0,0,0,2, +3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, +3,3,3,3,3,3,3,2,2,2,2,3,2,3,3,0,3,3,1,1,2,2,0,0,2,2,3,2,0,0,1,3, +0,3,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1, +3,3,3,2,3,3,3,2,1,2,2,3,2,3,3,0,3,2,0,0,1,1,0,1,1,2,1,2,0,0,0,1, +0,3,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0, +3,3,3,2,3,3,2,3,2,2,2,3,3,3,3,1,3,1,1,0,3,2,1,1,3,3,2,3,1,0,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,0,1, +3,2,2,3,3,0,3,3,3,3,3,3,3,2,2,1,0,3,3,1,3,3,0,1,3,3,2,3,0,3,0,3, +2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +2,2,2,3,3,0,3,3,3,3,3,3,3,3,3,0,0,3,2,0,3,3,0,3,2,3,3,3,0,3,1,3, +2,0,0,0,0,0,0,0,0,0,0,1,0,1,2,0,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, +3,3,3,1,2,3,3,1,0,0,1,0,0,3,3,2,3,0,0,2,0,0,2,0,2,0,0,0,2,0,2,0, +0,3,1,0,1,0,0,0,2,2,1,0,1,1,2,1,2,2,2,0,2,1,1,0,0,0,2,0,0,0,0,0, +1,2,1,3,3,0,3,3,3,3,3,2,3,0,0,0,0,2,3,0,2,3,1,0,2,3,1,3,0,3,0,2, +3,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,1,3,3,2,2,3,2,2,0,1,2,3,0,1,2,1,0,1,0,0,0,1,0,2,2,0,0,0,1, +1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0, +3,3,3,1,3,3,1,1,3,3,1,1,3,3,1,0,2,1,2,0,2,1,0,0,1,1,2,1,0,0,0,2, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,1,0,2,1,3,0,0,2,0,0,3,3,0,3,0,0,1,0,1,2,0,0,1,1,2,2,0,1,0, +0,1,2,1,1,0,1,0,1,1,1,1,1,0,1,1,1,2,2,1,2,0,1,0,0,0,0,0,0,1,0,0, +3,3,3,2,3,2,3,3,0,2,2,2,3,3,3,0,3,0,0,0,2,2,0,1,2,1,1,1,0,0,0,1, +0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +3,3,3,3,3,3,2,1,2,2,3,3,3,3,2,0,2,0,0,0,2,2,0,0,2,1,3,3,0,0,1,1, +1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0, +1,1,2,3,3,0,3,3,3,3,3,3,2,2,0,2,0,2,3,2,3,2,2,2,2,2,2,2,1,3,2,3, +2,0,2,1,2,2,2,2,1,1,2,2,1,2,2,1,2,0,0,2,1,1,0,2,1,0,0,1,0,0,0,1, +2,3,3,1,1,1,0,1,1,1,2,3,2,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0, +0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,2,3,2,2,1,3,3,3,0,2,1,2,0,2,1,0,0,1,1,1,1,1,0,0,1, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, +3,3,3,2,3,3,3,3,3,2,3,1,2,3,3,1,2,0,0,0,0,0,0,0,3,2,1,1,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +3,3,3,2,2,3,3,2,1,1,1,1,1,3,3,0,3,1,0,0,1,1,0,0,3,1,2,1,0,0,0,0, +0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, +3,3,3,2,2,3,2,2,2,3,2,1,1,3,3,0,3,0,0,0,0,1,0,0,3,1,1,2,0,0,0,1, +1,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,1,3,3,0,3,3,3,3,3,2,2,2,1,2,0,2,1,2,2,1,1,0,1,2,2,2,2,2,2,2, +0,0,2,1,2,1,2,1,0,1,1,3,1,2,1,1,2,0,0,2,0,1,0,1,0,1,0,0,0,1,0,1, +3,3,3,1,3,3,3,0,1,1,0,2,2,3,1,0,3,0,0,0,1,0,0,0,1,0,0,1,0,1,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,2,2,1,0,0,1,0,0,3,3,1,3,0,0,1,1,0,2,0,3,0,0,0,2,0,1,1, +0,1,2,0,1,2,2,0,2,2,2,2,1,0,2,1,1,0,2,0,2,1,2,0,0,0,0,0,0,0,0,0, +3,3,3,1,3,2,3,2,0,2,2,2,1,3,2,0,2,1,2,0,1,2,0,0,1,0,2,2,0,0,0,2, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0, +3,3,3,0,3,3,1,1,2,3,1,0,3,2,3,0,3,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0, +1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,3,3,0,3,3,2,3,3,2,2,0,0,0,0,1,2,0,1,3,0,0,0,3,1,1,0,3,0,2, +2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,1,2,2,1,0,3,1,1,1,1,3,3,2,3,0,0,1,0,1,2,0,2,2,0,2,2,0,2,1, +0,2,2,1,1,1,1,0,2,1,1,0,1,1,1,1,2,1,2,1,2,0,1,0,1,0,0,0,0,0,0,0, +3,3,3,0,1,1,3,0,0,1,1,0,0,2,2,0,3,0,0,1,1,0,1,0,0,0,0,0,2,0,0,0, +0,3,1,0,1,0,1,0,2,0,0,1,0,1,0,1,1,1,2,1,1,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,0,2,0,1,1,1,0,0,3,3,0,2,0,0,1,0,0,2,1,1,0,1,0,1,0,1,0, +0,2,0,1,2,0,2,0,2,1,1,0,1,0,2,1,1,0,2,1,1,0,1,0,0,0,1,1,0,0,0,0, +3,2,3,0,1,0,0,0,0,0,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,0,2,0,0,0, +0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,2,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,0,0,2,3,0,0,1,0,1,0,2,3,2,3,0,0,1,3,0,2,1,0,0,0,0,2,0,1,0, +0,2,1,0,0,1,1,0,2,1,0,0,1,0,0,1,1,0,1,1,2,0,1,0,0,0,0,1,0,0,0,0, +3,2,2,0,0,1,1,0,0,0,0,0,0,3,1,1,1,0,0,0,0,0,1,0,0,0,0,0,2,0,1,0, +0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,3,3,0,2,3,2,2,1,2,2,1,1,2,0,1,3,2,2,2,0,0,2,2,0,0,0,1,2,1, +3,0,2,1,1,0,1,1,1,0,1,2,2,2,1,1,2,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0, +0,1,1,2,3,0,3,3,3,2,2,2,2,1,0,1,0,1,0,1,2,2,0,0,2,2,1,3,1,1,2,1, +0,0,1,1,2,0,1,1,0,0,1,2,0,2,1,1,2,0,0,1,0,0,0,1,0,1,0,1,0,0,0,0, +3,3,2,0,0,3,1,0,0,0,0,0,0,3,2,1,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, +0,2,1,1,0,0,1,0,1,2,0,0,1,1,0,0,2,1,1,1,1,0,2,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,1,0,0,0,0,1,0,0,3,3,2,2,0,0,1,0,0,2,0,1,0,0,0,2,0,1,0, +0,0,1,1,0,0,2,0,2,1,0,0,1,1,2,1,2,0,2,1,2,1,1,1,0,0,1,1,0,0,0,0, +3,3,2,0,0,2,2,0,0,0,1,1,0,2,2,1,3,1,0,1,0,1,2,0,0,0,0,0,1,0,1,0, +0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,0,0,0,1,0,0,1,0,0,2,3,1,2,0,0,1,0,0,2,0,0,0,1,0,2,0,2,0, +0,1,1,2,2,1,2,0,2,1,1,0,0,1,1,0,1,1,1,1,2,1,1,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,1,2,1,0,0,1,1,0,3,3,1,2,0,0,1,0,0,2,0,2,0,1,1,2,0,0,0, +0,0,1,1,1,1,2,0,1,1,0,1,1,1,1,0,0,0,1,1,1,0,1,0,0,0,1,0,0,0,0,0, +3,3,3,0,2,2,3,2,0,0,1,0,0,2,3,1,0,0,0,0,0,0,2,0,2,0,0,0,2,0,0,0, +0,1,1,0,0,0,1,0,0,1,0,1,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,0,0,0,0,0,0,0,1,0,0,2,2,2,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, +0,0,2,1,1,0,1,0,2,1,1,0,0,1,1,2,1,0,2,0,2,0,1,0,0,0,2,0,0,0,0,0, +0,0,0,2,2,0,2,1,1,1,1,2,2,0,0,1,0,1,0,0,1,3,0,0,0,0,1,0,0,2,1,0, +0,0,1,0,1,0,0,0,0,0,2,1,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +2,0,0,2,3,0,2,3,1,2,2,0,2,0,0,2,0,2,1,1,1,2,1,0,0,1,2,1,1,2,1,0, +1,0,2,0,1,0,1,1,0,0,2,2,1,2,1,1,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,1,2,0,0,0,1,0,0,3,2,0,1,0,0,1,0,0,2,0,0,0,1,2,1,0,1,0, +0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,2,2,0,2,2,1,1,0,1,1,1,1,1,0,0,1,2,1,1,1,0,1,0,0,0,1,1,1,1, +0,0,2,1,0,1,1,1,0,1,1,2,1,2,1,1,2,0,1,1,2,1,0,2,0,0,0,0,0,0,0,0, +3,2,2,0,0,2,0,0,0,0,0,0,0,2,2,0,2,0,0,1,0,0,2,0,0,0,0,0,2,0,0,0, +0,2,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,3,2,0,2,2,0,1,1,0,1,0,0,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0, +2,0,1,0,1,0,1,1,0,0,1,2,0,1,0,1,1,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0, +2,2,2,0,1,1,0,0,0,1,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,1,2,0,1,0, +0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,1,0,1,1,1,0,0,0,0,1,2,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +1,1,2,0,1,0,0,0,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,1, +0,0,1,2,2,0,2,1,2,1,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +2,2,2,0,0,0,1,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,0,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +Latin5TurkishModel = { + 'char_to_order_map': Latin5_TurkishCharToOrderMap, + 'precedence_matrix': TurkishLangModel, + 'typical_positive_ratio': 0.970290, + 'keep_english_letter': True, + 'charset_name': "ISO-8859-9", + 'language': 'Turkish', +} diff --git a/cres/venv/lib/python3.8/site-packages/chardet/latin1prober.py b/cres/venv/lib/python3.8/site-packages/chardet/latin1prober.py new file mode 100644 index 000000000..7d1e8c20f --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet/latin1prober.py @@ -0,0 +1,145 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState + +FREQ_CAT_NUM = 4 + +UDF = 0 # undefined +OTH = 1 # other +ASC = 2 # ascii capital letter +ASS = 3 # ascii small letter +ACV = 4 # accent capital vowel +ACO = 5 # accent capital other +ASV = 6 # accent small vowel +ASO = 7 # accent small other +CLASS_NUM = 8 # total classes + +Latin1_CharToClass = ( + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 10 - 17 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 18 - 1F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 20 - 27 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 28 - 2F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 30 - 37 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 38 - 3F + OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 40 - 47 + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 48 - 4F + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 50 - 57 + ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, # 58 - 5F + OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 60 - 67 + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 68 - 6F + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 70 - 77 + ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, # 78 - 7F + OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH, # 80 - 87 + OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF, # 88 - 8F + UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 90 - 97 + OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO, # 98 - 9F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A0 - A7 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A8 - AF + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B0 - B7 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B8 - BF + ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO, # C0 - C7 + ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, # C8 - CF + ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH, # D0 - D7 + ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO, # D8 - DF + ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO, # E0 - E7 + ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, # E8 - EF + ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH, # F0 - F7 + ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO, # F8 - FF +) + +# 0 : illegal +# 1 : very unlikely +# 2 : normal +# 3 : very likely +Latin1ClassModel = ( +# UDF OTH ASC ASS ACV ACO ASV ASO + 0, 0, 0, 0, 0, 0, 0, 0, # UDF + 0, 3, 3, 3, 3, 3, 3, 3, # OTH + 0, 3, 3, 3, 3, 3, 3, 3, # ASC + 0, 3, 3, 3, 1, 1, 3, 3, # ASS + 0, 3, 3, 3, 1, 2, 1, 2, # ACV + 0, 3, 3, 3, 3, 3, 3, 3, # ACO + 0, 3, 1, 3, 1, 1, 1, 3, # ASV + 0, 3, 1, 3, 1, 1, 3, 3, # ASO +) + + +class Latin1Prober(CharSetProber): + def __init__(self): + super(Latin1Prober, self).__init__() + self._last_char_class = None + self._freq_counter = None + self.reset() + + def reset(self): + self._last_char_class = OTH + self._freq_counter = [0] * FREQ_CAT_NUM + CharSetProber.reset(self) + + @property + def charset_name(self): + return "ISO-8859-1" + + @property + def language(self): + return "" + + def feed(self, byte_str): + byte_str = self.filter_with_english_letters(byte_str) + for c in byte_str: + char_class = Latin1_CharToClass[c] + freq = Latin1ClassModel[(self._last_char_class * CLASS_NUM) + + char_class] + if freq == 0: + self._state = ProbingState.NOT_ME + break + self._freq_counter[freq] += 1 + self._last_char_class = char_class + + return self.state + + def get_confidence(self): + if self.state == ProbingState.NOT_ME: + return 0.01 + + total = sum(self._freq_counter) + if total < 0.01: + confidence = 0.0 + else: + confidence = ((self._freq_counter[3] - self._freq_counter[1] * 20.0) + / total) + if confidence < 0.0: + confidence = 0.0 + # lower the confidence of latin1 so that other more accurate + # detector can take priority. + confidence = confidence * 0.73 + return confidence diff --git a/cres/venv/lib/python3.8/site-packages/chardet/mbcharsetprober.py b/cres/venv/lib/python3.8/site-packages/chardet/mbcharsetprober.py new file mode 100644 index 000000000..6256ecfd1 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet/mbcharsetprober.py @@ -0,0 +1,91 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Proofpoint, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState, MachineState + + +class MultiByteCharSetProber(CharSetProber): + """ + MultiByteCharSetProber + """ + + def __init__(self, lang_filter=None): + super(MultiByteCharSetProber, self).__init__(lang_filter=lang_filter) + self.distribution_analyzer = None + self.coding_sm = None + self._last_char = [0, 0] + + def reset(self): + super(MultiByteCharSetProber, self).reset() + if self.coding_sm: + self.coding_sm.reset() + if self.distribution_analyzer: + self.distribution_analyzer.reset() + self._last_char = [0, 0] + + @property + def charset_name(self): + raise NotImplementedError + + @property + def language(self): + raise NotImplementedError + + def feed(self, byte_str): + for i in range(len(byte_str)): + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte_str[0] + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if (self.distribution_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + return self.distribution_analyzer.get_confidence() diff --git a/cres/venv/lib/python3.8/site-packages/chardet/mbcsgroupprober.py b/cres/venv/lib/python3.8/site-packages/chardet/mbcsgroupprober.py new file mode 100644 index 000000000..530abe75e --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet/mbcsgroupprober.py @@ -0,0 +1,54 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Proofpoint, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetgroupprober import CharSetGroupProber +from .utf8prober import UTF8Prober +from .sjisprober import SJISProber +from .eucjpprober import EUCJPProber +from .gb2312prober import GB2312Prober +from .euckrprober import EUCKRProber +from .cp949prober import CP949Prober +from .big5prober import Big5Prober +from .euctwprober import EUCTWProber + + +class MBCSGroupProber(CharSetGroupProber): + def __init__(self, lang_filter=None): + super(MBCSGroupProber, self).__init__(lang_filter=lang_filter) + self.probers = [ + UTF8Prober(), + SJISProber(), + EUCJPProber(), + GB2312Prober(), + EUCKRProber(), + CP949Prober(), + Big5Prober(), + EUCTWProber() + ] + self.reset() diff --git a/cres/venv/lib/python3.8/site-packages/chardet/mbcssm.py b/cres/venv/lib/python3.8/site-packages/chardet/mbcssm.py new file mode 100644 index 000000000..8360d0f28 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet/mbcssm.py @@ -0,0 +1,572 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import MachineState + +# BIG5 + +BIG5_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as legal value + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,1, # 78 - 7f + 4,4,4,4,4,4,4,4, # 80 - 87 + 4,4,4,4,4,4,4,4, # 88 - 8f + 4,4,4,4,4,4,4,4, # 90 - 97 + 4,4,4,4,4,4,4,4, # 98 - 9f + 4,3,3,3,3,3,3,3, # a0 - a7 + 3,3,3,3,3,3,3,3, # a8 - af + 3,3,3,3,3,3,3,3, # b0 - b7 + 3,3,3,3,3,3,3,3, # b8 - bf + 3,3,3,3,3,3,3,3, # c0 - c7 + 3,3,3,3,3,3,3,3, # c8 - cf + 3,3,3,3,3,3,3,3, # d0 - d7 + 3,3,3,3,3,3,3,3, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,3,3,3, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,3,3,0 # f8 - ff +) + +BIG5_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,#08-0f + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START#10-17 +) + +BIG5_CHAR_LEN_TABLE = (0, 1, 1, 2, 0) + +BIG5_SM_MODEL = {'class_table': BIG5_CLS, + 'class_factor': 5, + 'state_table': BIG5_ST, + 'char_len_table': BIG5_CHAR_LEN_TABLE, + 'name': 'Big5'} + +# CP949 + +CP949_CLS = ( + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0, # 00 - 0f + 1,1,1,1,1,1,1,1, 1,1,1,0,1,1,1,1, # 10 - 1f + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 20 - 2f + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 30 - 3f + 1,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4, # 40 - 4f + 4,4,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 50 - 5f + 1,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5, # 60 - 6f + 5,5,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 70 - 7f + 0,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 80 - 8f + 6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 90 - 9f + 6,7,7,7,7,7,7,7, 7,7,7,7,7,8,8,8, # a0 - af + 7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7, # b0 - bf + 7,7,7,7,7,7,9,2, 2,3,2,2,2,2,2,2, # c0 - cf + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # d0 - df + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # e0 - ef + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,0, # f0 - ff +) + +CP949_ST = ( +#cls= 0 1 2 3 4 5 6 7 8 9 # previous state = + MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START, 4, 5,MachineState.ERROR, 6, # MachineState.START + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, # MachineState.ERROR + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME, # MachineState.ITS_ME + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 3 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 4 + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 5 + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 6 +) + +CP949_CHAR_LEN_TABLE = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2) + +CP949_SM_MODEL = {'class_table': CP949_CLS, + 'class_factor': 10, + 'state_table': CP949_ST, + 'char_len_table': CP949_CHAR_LEN_TABLE, + 'name': 'CP949'} + +# EUC-JP + +EUCJP_CLS = ( + 4,4,4,4,4,4,4,4, # 00 - 07 + 4,4,4,4,4,4,5,5, # 08 - 0f + 4,4,4,4,4,4,4,4, # 10 - 17 + 4,4,4,5,4,4,4,4, # 18 - 1f + 4,4,4,4,4,4,4,4, # 20 - 27 + 4,4,4,4,4,4,4,4, # 28 - 2f + 4,4,4,4,4,4,4,4, # 30 - 37 + 4,4,4,4,4,4,4,4, # 38 - 3f + 4,4,4,4,4,4,4,4, # 40 - 47 + 4,4,4,4,4,4,4,4, # 48 - 4f + 4,4,4,4,4,4,4,4, # 50 - 57 + 4,4,4,4,4,4,4,4, # 58 - 5f + 4,4,4,4,4,4,4,4, # 60 - 67 + 4,4,4,4,4,4,4,4, # 68 - 6f + 4,4,4,4,4,4,4,4, # 70 - 77 + 4,4,4,4,4,4,4,4, # 78 - 7f + 5,5,5,5,5,5,5,5, # 80 - 87 + 5,5,5,5,5,5,1,3, # 88 - 8f + 5,5,5,5,5,5,5,5, # 90 - 97 + 5,5,5,5,5,5,5,5, # 98 - 9f + 5,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,2,2,2, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,2,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,0,5 # f8 - ff +) + +EUCJP_ST = ( + 3, 4, 3, 5,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 3,MachineState.ERROR,#18-1f + 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START#20-27 +) + +EUCJP_CHAR_LEN_TABLE = (2, 2, 2, 3, 1, 0) + +EUCJP_SM_MODEL = {'class_table': EUCJP_CLS, + 'class_factor': 6, + 'state_table': EUCJP_ST, + 'char_len_table': EUCJP_CHAR_LEN_TABLE, + 'name': 'EUC-JP'} + +# EUC-KR + +EUCKR_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 1,1,1,1,1,1,1,1, # 40 - 47 + 1,1,1,1,1,1,1,1, # 48 - 4f + 1,1,1,1,1,1,1,1, # 50 - 57 + 1,1,1,1,1,1,1,1, # 58 - 5f + 1,1,1,1,1,1,1,1, # 60 - 67 + 1,1,1,1,1,1,1,1, # 68 - 6f + 1,1,1,1,1,1,1,1, # 70 - 77 + 1,1,1,1,1,1,1,1, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,3,3,3, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,3,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 2,2,2,2,2,2,2,2, # e0 - e7 + 2,2,2,2,2,2,2,2, # e8 - ef + 2,2,2,2,2,2,2,2, # f0 - f7 + 2,2,2,2,2,2,2,0 # f8 - ff +) + +EUCKR_ST = ( + MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #08-0f +) + +EUCKR_CHAR_LEN_TABLE = (0, 1, 2, 0) + +EUCKR_SM_MODEL = {'class_table': EUCKR_CLS, + 'class_factor': 4, + 'state_table': EUCKR_ST, + 'char_len_table': EUCKR_CHAR_LEN_TABLE, + 'name': 'EUC-KR'} + +# EUC-TW + +EUCTW_CLS = ( + 2,2,2,2,2,2,2,2, # 00 - 07 + 2,2,2,2,2,2,0,0, # 08 - 0f + 2,2,2,2,2,2,2,2, # 10 - 17 + 2,2,2,0,2,2,2,2, # 18 - 1f + 2,2,2,2,2,2,2,2, # 20 - 27 + 2,2,2,2,2,2,2,2, # 28 - 2f + 2,2,2,2,2,2,2,2, # 30 - 37 + 2,2,2,2,2,2,2,2, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,2, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,6,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,3,4,4,4,4,4,4, # a0 - a7 + 5,5,1,1,1,1,1,1, # a8 - af + 1,1,1,1,1,1,1,1, # b0 - b7 + 1,1,1,1,1,1,1,1, # b8 - bf + 1,1,3,1,3,3,3,3, # c0 - c7 + 3,3,3,3,3,3,3,3, # c8 - cf + 3,3,3,3,3,3,3,3, # d0 - d7 + 3,3,3,3,3,3,3,3, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,3,3,3, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,3,3,0 # f8 - ff +) + +EUCTW_ST = ( + MachineState.ERROR,MachineState.ERROR,MachineState.START, 3, 3, 3, 4,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.ERROR,#10-17 + MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,#20-27 + MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f +) + +EUCTW_CHAR_LEN_TABLE = (0, 0, 1, 2, 2, 2, 3) + +EUCTW_SM_MODEL = {'class_table': EUCTW_CLS, + 'class_factor': 7, + 'state_table': EUCTW_ST, + 'char_len_table': EUCTW_CHAR_LEN_TABLE, + 'name': 'x-euc-tw'} + +# GB2312 + +GB2312_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 3,3,3,3,3,3,3,3, # 30 - 37 + 3,3,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,4, # 78 - 7f + 5,6,6,6,6,6,6,6, # 80 - 87 + 6,6,6,6,6,6,6,6, # 88 - 8f + 6,6,6,6,6,6,6,6, # 90 - 97 + 6,6,6,6,6,6,6,6, # 98 - 9f + 6,6,6,6,6,6,6,6, # a0 - a7 + 6,6,6,6,6,6,6,6, # a8 - af + 6,6,6,6,6,6,6,6, # b0 - b7 + 6,6,6,6,6,6,6,6, # b8 - bf + 6,6,6,6,6,6,6,6, # c0 - c7 + 6,6,6,6,6,6,6,6, # c8 - cf + 6,6,6,6,6,6,6,6, # d0 - d7 + 6,6,6,6,6,6,6,6, # d8 - df + 6,6,6,6,6,6,6,6, # e0 - e7 + 6,6,6,6,6,6,6,6, # e8 - ef + 6,6,6,6,6,6,6,6, # f0 - f7 + 6,6,6,6,6,6,6,0 # f8 - ff +) + +GB2312_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, 3,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,#10-17 + 4,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#20-27 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f +) + +# To be accurate, the length of class 6 can be either 2 or 4. +# But it is not necessary to discriminate between the two since +# it is used for frequency analysis only, and we are validating +# each code range there as well. So it is safe to set it to be +# 2 here. +GB2312_CHAR_LEN_TABLE = (0, 1, 1, 1, 1, 1, 2) + +GB2312_SM_MODEL = {'class_table': GB2312_CLS, + 'class_factor': 7, + 'state_table': GB2312_ST, + 'char_len_table': GB2312_CHAR_LEN_TABLE, + 'name': 'GB2312'} + +# Shift_JIS + +SJIS_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,1, # 78 - 7f + 3,3,3,3,3,2,2,3, # 80 - 87 + 3,3,3,3,3,3,3,3, # 88 - 8f + 3,3,3,3,3,3,3,3, # 90 - 97 + 3,3,3,3,3,3,3,3, # 98 - 9f + #0xa0 is illegal in sjis encoding, but some pages does + #contain such byte. We need to be more error forgiven. + 2,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,2,2,2, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,2,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,4,4,4, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,0,0,0) # f8 - ff + + +SJIS_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START #10-17 +) + +SJIS_CHAR_LEN_TABLE = (0, 1, 1, 2, 0, 0) + +SJIS_SM_MODEL = {'class_table': SJIS_CLS, + 'class_factor': 6, + 'state_table': SJIS_ST, + 'char_len_table': SJIS_CHAR_LEN_TABLE, + 'name': 'Shift_JIS'} + +# UCS2-BE + +UCS2BE_CLS = ( + 0,0,0,0,0,0,0,0, # 00 - 07 + 0,0,1,0,0,2,0,0, # 08 - 0f + 0,0,0,0,0,0,0,0, # 10 - 17 + 0,0,0,3,0,0,0,0, # 18 - 1f + 0,0,0,0,0,0,0,0, # 20 - 27 + 0,3,3,3,3,3,0,0, # 28 - 2f + 0,0,0,0,0,0,0,0, # 30 - 37 + 0,0,0,0,0,0,0,0, # 38 - 3f + 0,0,0,0,0,0,0,0, # 40 - 47 + 0,0,0,0,0,0,0,0, # 48 - 4f + 0,0,0,0,0,0,0,0, # 50 - 57 + 0,0,0,0,0,0,0,0, # 58 - 5f + 0,0,0,0,0,0,0,0, # 60 - 67 + 0,0,0,0,0,0,0,0, # 68 - 6f + 0,0,0,0,0,0,0,0, # 70 - 77 + 0,0,0,0,0,0,0,0, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,0,0,0,0,0,0,0, # a0 - a7 + 0,0,0,0,0,0,0,0, # a8 - af + 0,0,0,0,0,0,0,0, # b0 - b7 + 0,0,0,0,0,0,0,0, # b8 - bf + 0,0,0,0,0,0,0,0, # c0 - c7 + 0,0,0,0,0,0,0,0, # c8 - cf + 0,0,0,0,0,0,0,0, # d0 - d7 + 0,0,0,0,0,0,0,0, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,4,5 # f8 - ff +) + +UCS2BE_ST = ( + 5, 7, 7,MachineState.ERROR, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME, 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,#10-17 + 6, 6, 6, 6, 6,MachineState.ITS_ME, 6, 6,#18-1f + 6, 6, 6, 6, 5, 7, 7,MachineState.ERROR,#20-27 + 5, 8, 6, 6,MachineState.ERROR, 6, 6, 6,#28-2f + 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #30-37 +) + +UCS2BE_CHAR_LEN_TABLE = (2, 2, 2, 0, 2, 2) + +UCS2BE_SM_MODEL = {'class_table': UCS2BE_CLS, + 'class_factor': 6, + 'state_table': UCS2BE_ST, + 'char_len_table': UCS2BE_CHAR_LEN_TABLE, + 'name': 'UTF-16BE'} + +# UCS2-LE + +UCS2LE_CLS = ( + 0,0,0,0,0,0,0,0, # 00 - 07 + 0,0,1,0,0,2,0,0, # 08 - 0f + 0,0,0,0,0,0,0,0, # 10 - 17 + 0,0,0,3,0,0,0,0, # 18 - 1f + 0,0,0,0,0,0,0,0, # 20 - 27 + 0,3,3,3,3,3,0,0, # 28 - 2f + 0,0,0,0,0,0,0,0, # 30 - 37 + 0,0,0,0,0,0,0,0, # 38 - 3f + 0,0,0,0,0,0,0,0, # 40 - 47 + 0,0,0,0,0,0,0,0, # 48 - 4f + 0,0,0,0,0,0,0,0, # 50 - 57 + 0,0,0,0,0,0,0,0, # 58 - 5f + 0,0,0,0,0,0,0,0, # 60 - 67 + 0,0,0,0,0,0,0,0, # 68 - 6f + 0,0,0,0,0,0,0,0, # 70 - 77 + 0,0,0,0,0,0,0,0, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,0,0,0,0,0,0,0, # a0 - a7 + 0,0,0,0,0,0,0,0, # a8 - af + 0,0,0,0,0,0,0,0, # b0 - b7 + 0,0,0,0,0,0,0,0, # b8 - bf + 0,0,0,0,0,0,0,0, # c0 - c7 + 0,0,0,0,0,0,0,0, # c8 - cf + 0,0,0,0,0,0,0,0, # d0 - d7 + 0,0,0,0,0,0,0,0, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,4,5 # f8 - ff +) + +UCS2LE_ST = ( + 6, 6, 7, 6, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME, 5, 5, 5,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#10-17 + 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR, 6, 6,#18-1f + 7, 6, 8, 8, 5, 5, 5,MachineState.ERROR,#20-27 + 5, 5, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5,#28-2f + 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR,MachineState.START,MachineState.START #30-37 +) + +UCS2LE_CHAR_LEN_TABLE = (2, 2, 2, 2, 2, 2) + +UCS2LE_SM_MODEL = {'class_table': UCS2LE_CLS, + 'class_factor': 6, + 'state_table': UCS2LE_ST, + 'char_len_table': UCS2LE_CHAR_LEN_TABLE, + 'name': 'UTF-16LE'} + +# UTF-8 + +UTF8_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as a legal value + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 1,1,1,1,1,1,1,1, # 40 - 47 + 1,1,1,1,1,1,1,1, # 48 - 4f + 1,1,1,1,1,1,1,1, # 50 - 57 + 1,1,1,1,1,1,1,1, # 58 - 5f + 1,1,1,1,1,1,1,1, # 60 - 67 + 1,1,1,1,1,1,1,1, # 68 - 6f + 1,1,1,1,1,1,1,1, # 70 - 77 + 1,1,1,1,1,1,1,1, # 78 - 7f + 2,2,2,2,3,3,3,3, # 80 - 87 + 4,4,4,4,4,4,4,4, # 88 - 8f + 4,4,4,4,4,4,4,4, # 90 - 97 + 4,4,4,4,4,4,4,4, # 98 - 9f + 5,5,5,5,5,5,5,5, # a0 - a7 + 5,5,5,5,5,5,5,5, # a8 - af + 5,5,5,5,5,5,5,5, # b0 - b7 + 5,5,5,5,5,5,5,5, # b8 - bf + 0,0,6,6,6,6,6,6, # c0 - c7 + 6,6,6,6,6,6,6,6, # c8 - cf + 6,6,6,6,6,6,6,6, # d0 - d7 + 6,6,6,6,6,6,6,6, # d8 - df + 7,8,8,8,8,8,8,8, # e0 - e7 + 8,8,8,8,8,9,8,8, # e8 - ef + 10,11,11,11,11,11,11,11, # f0 - f7 + 12,13,13,13,14,15,0,0 # f8 - ff +) + +UTF8_ST = ( + MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12, 10,#00-07 + 9, 11, 8, 7, 6, 5, 4, 3,#08-0f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#20-27 + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#28-2f + MachineState.ERROR,MachineState.ERROR, 5, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#30-37 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#38-3f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#40-47 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#48-4f + MachineState.ERROR,MachineState.ERROR, 7, 7, 7, 7,MachineState.ERROR,MachineState.ERROR,#50-57 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#58-5f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 7, 7,MachineState.ERROR,MachineState.ERROR,#60-67 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#68-6f + MachineState.ERROR,MachineState.ERROR, 9, 9, 9, 9,MachineState.ERROR,MachineState.ERROR,#70-77 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#78-7f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 9,MachineState.ERROR,MachineState.ERROR,#80-87 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#88-8f + MachineState.ERROR,MachineState.ERROR, 12, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,#90-97 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#98-9f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12,MachineState.ERROR,MachineState.ERROR,#a0-a7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#a8-af + MachineState.ERROR,MachineState.ERROR, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b0-b7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b8-bf + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,#c0-c7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR #c8-cf +) + +UTF8_CHAR_LEN_TABLE = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6) + +UTF8_SM_MODEL = {'class_table': UTF8_CLS, + 'class_factor': 16, + 'state_table': UTF8_ST, + 'char_len_table': UTF8_CHAR_LEN_TABLE, + 'name': 'UTF-8'} diff --git a/cres/venv/lib/python3.8/site-packages/chardet/sbcharsetprober.py b/cres/venv/lib/python3.8/site-packages/chardet/sbcharsetprober.py new file mode 100644 index 000000000..0adb51de5 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet/sbcharsetprober.py @@ -0,0 +1,132 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import CharacterCategory, ProbingState, SequenceLikelihood + + +class SingleByteCharSetProber(CharSetProber): + SAMPLE_SIZE = 64 + SB_ENOUGH_REL_THRESHOLD = 1024 # 0.25 * SAMPLE_SIZE^2 + POSITIVE_SHORTCUT_THRESHOLD = 0.95 + NEGATIVE_SHORTCUT_THRESHOLD = 0.05 + + def __init__(self, model, reversed=False, name_prober=None): + super(SingleByteCharSetProber, self).__init__() + self._model = model + # TRUE if we need to reverse every pair in the model lookup + self._reversed = reversed + # Optional auxiliary prober for name decision + self._name_prober = name_prober + self._last_order = None + self._seq_counters = None + self._total_seqs = None + self._total_char = None + self._freq_char = None + self.reset() + + def reset(self): + super(SingleByteCharSetProber, self).reset() + # char order of last character + self._last_order = 255 + self._seq_counters = [0] * SequenceLikelihood.get_num_categories() + self._total_seqs = 0 + self._total_char = 0 + # characters that fall in our sampling range + self._freq_char = 0 + + @property + def charset_name(self): + if self._name_prober: + return self._name_prober.charset_name + else: + return self._model['charset_name'] + + @property + def language(self): + if self._name_prober: + return self._name_prober.language + else: + return self._model.get('language') + + def feed(self, byte_str): + if not self._model['keep_english_letter']: + byte_str = self.filter_international_words(byte_str) + if not byte_str: + return self.state + char_to_order_map = self._model['char_to_order_map'] + for i, c in enumerate(byte_str): + # XXX: Order is in range 1-64, so one would think we want 0-63 here, + # but that leads to 27 more test failures than before. + order = char_to_order_map[c] + # XXX: This was SYMBOL_CAT_ORDER before, with a value of 250, but + # CharacterCategory.SYMBOL is actually 253, so we use CONTROL + # to make it closer to the original intent. The only difference + # is whether or not we count digits and control characters for + # _total_char purposes. + if order < CharacterCategory.CONTROL: + self._total_char += 1 + if order < self.SAMPLE_SIZE: + self._freq_char += 1 + if self._last_order < self.SAMPLE_SIZE: + self._total_seqs += 1 + if not self._reversed: + i = (self._last_order * self.SAMPLE_SIZE) + order + model = self._model['precedence_matrix'][i] + else: # reverse the order of the letters in the lookup + i = (order * self.SAMPLE_SIZE) + self._last_order + model = self._model['precedence_matrix'][i] + self._seq_counters[model] += 1 + self._last_order = order + + charset_name = self._model['charset_name'] + if self.state == ProbingState.DETECTING: + if self._total_seqs > self.SB_ENOUGH_REL_THRESHOLD: + confidence = self.get_confidence() + if confidence > self.POSITIVE_SHORTCUT_THRESHOLD: + self.logger.debug('%s confidence = %s, we have a winner', + charset_name, confidence) + self._state = ProbingState.FOUND_IT + elif confidence < self.NEGATIVE_SHORTCUT_THRESHOLD: + self.logger.debug('%s confidence = %s, below negative ' + 'shortcut threshhold %s', charset_name, + confidence, + self.NEGATIVE_SHORTCUT_THRESHOLD) + self._state = ProbingState.NOT_ME + + return self.state + + def get_confidence(self): + r = 0.01 + if self._total_seqs > 0: + r = ((1.0 * self._seq_counters[SequenceLikelihood.POSITIVE]) / + self._total_seqs / self._model['typical_positive_ratio']) + r = r * self._freq_char / self._total_char + if r >= 1.0: + r = 0.99 + return r diff --git a/cres/venv/lib/python3.8/site-packages/chardet/sbcsgroupprober.py b/cres/venv/lib/python3.8/site-packages/chardet/sbcsgroupprober.py new file mode 100644 index 000000000..98e95dc1a --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet/sbcsgroupprober.py @@ -0,0 +1,73 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetgroupprober import CharSetGroupProber +from .sbcharsetprober import SingleByteCharSetProber +from .langcyrillicmodel import (Win1251CyrillicModel, Koi8rModel, + Latin5CyrillicModel, MacCyrillicModel, + Ibm866Model, Ibm855Model) +from .langgreekmodel import Latin7GreekModel, Win1253GreekModel +from .langbulgarianmodel import Latin5BulgarianModel, Win1251BulgarianModel +# from .langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel +from .langthaimodel import TIS620ThaiModel +from .langhebrewmodel import Win1255HebrewModel +from .hebrewprober import HebrewProber +from .langturkishmodel import Latin5TurkishModel + + +class SBCSGroupProber(CharSetGroupProber): + def __init__(self): + super(SBCSGroupProber, self).__init__() + self.probers = [ + SingleByteCharSetProber(Win1251CyrillicModel), + SingleByteCharSetProber(Koi8rModel), + SingleByteCharSetProber(Latin5CyrillicModel), + SingleByteCharSetProber(MacCyrillicModel), + SingleByteCharSetProber(Ibm866Model), + SingleByteCharSetProber(Ibm855Model), + SingleByteCharSetProber(Latin7GreekModel), + SingleByteCharSetProber(Win1253GreekModel), + SingleByteCharSetProber(Latin5BulgarianModel), + SingleByteCharSetProber(Win1251BulgarianModel), + # TODO: Restore Hungarian encodings (iso-8859-2 and windows-1250) + # after we retrain model. + # SingleByteCharSetProber(Latin2HungarianModel), + # SingleByteCharSetProber(Win1250HungarianModel), + SingleByteCharSetProber(TIS620ThaiModel), + SingleByteCharSetProber(Latin5TurkishModel), + ] + hebrew_prober = HebrewProber() + logical_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, + False, hebrew_prober) + visual_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, True, + hebrew_prober) + hebrew_prober.set_model_probers(logical_hebrew_prober, visual_hebrew_prober) + self.probers.extend([hebrew_prober, logical_hebrew_prober, + visual_hebrew_prober]) + + self.reset() diff --git a/cres/venv/lib/python3.8/site-packages/chardet/sjisprober.py b/cres/venv/lib/python3.8/site-packages/chardet/sjisprober.py new file mode 100644 index 000000000..9e29623bd --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet/sjisprober.py @@ -0,0 +1,92 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import SJISDistributionAnalysis +from .jpcntx import SJISContextAnalysis +from .mbcssm import SJIS_SM_MODEL +from .enums import ProbingState, MachineState + + +class SJISProber(MultiByteCharSetProber): + def __init__(self): + super(SJISProber, self).__init__() + self.coding_sm = CodingStateMachine(SJIS_SM_MODEL) + self.distribution_analyzer = SJISDistributionAnalysis() + self.context_analyzer = SJISContextAnalysis() + self.reset() + + def reset(self): + super(SJISProber, self).reset() + self.context_analyzer.reset() + + @property + def charset_name(self): + return self.context_analyzer.charset_name + + @property + def language(self): + return "Japanese" + + def feed(self, byte_str): + for i in range(len(byte_str)): + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte_str[0] + self.context_analyzer.feed(self._last_char[2 - char_len:], + char_len) + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.context_analyzer.feed(byte_str[i + 1 - char_len:i + 3 + - char_len], char_len) + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if (self.context_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + context_conf = self.context_analyzer.get_confidence() + distrib_conf = self.distribution_analyzer.get_confidence() + return max(context_conf, distrib_conf) diff --git a/cres/venv/lib/python3.8/site-packages/chardet/universaldetector.py b/cres/venv/lib/python3.8/site-packages/chardet/universaldetector.py new file mode 100644 index 000000000..7b4e92d61 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet/universaldetector.py @@ -0,0 +1,286 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### +""" +Module containing the UniversalDetector detector class, which is the primary +class a user of ``chardet`` should use. + +:author: Mark Pilgrim (initial port to Python) +:author: Shy Shalom (original C code) +:author: Dan Blanchard (major refactoring for 3.0) +:author: Ian Cordasco +""" + + +import codecs +import logging +import re + +from .charsetgroupprober import CharSetGroupProber +from .enums import InputState, LanguageFilter, ProbingState +from .escprober import EscCharSetProber +from .latin1prober import Latin1Prober +from .mbcsgroupprober import MBCSGroupProber +from .sbcsgroupprober import SBCSGroupProber + + +class UniversalDetector(object): + """ + The ``UniversalDetector`` class underlies the ``chardet.detect`` function + and coordinates all of the different charset probers. + + To get a ``dict`` containing an encoding and its confidence, you can simply + run: + + .. code:: + + u = UniversalDetector() + u.feed(some_bytes) + u.close() + detected = u.result + + """ + + MINIMUM_THRESHOLD = 0.20 + HIGH_BYTE_DETECTOR = re.compile(b'[\x80-\xFF]') + ESC_DETECTOR = re.compile(b'(\033|~{)') + WIN_BYTE_DETECTOR = re.compile(b'[\x80-\x9F]') + ISO_WIN_MAP = {'iso-8859-1': 'Windows-1252', + 'iso-8859-2': 'Windows-1250', + 'iso-8859-5': 'Windows-1251', + 'iso-8859-6': 'Windows-1256', + 'iso-8859-7': 'Windows-1253', + 'iso-8859-8': 'Windows-1255', + 'iso-8859-9': 'Windows-1254', + 'iso-8859-13': 'Windows-1257'} + + def __init__(self, lang_filter=LanguageFilter.ALL): + self._esc_charset_prober = None + self._charset_probers = [] + self.result = None + self.done = None + self._got_data = None + self._input_state = None + self._last_char = None + self.lang_filter = lang_filter + self.logger = logging.getLogger(__name__) + self._has_win_bytes = None + self.reset() + + def reset(self): + """ + Reset the UniversalDetector and all of its probers back to their + initial states. This is called by ``__init__``, so you only need to + call this directly in between analyses of different documents. + """ + self.result = {'encoding': None, 'confidence': 0.0, 'language': None} + self.done = False + self._got_data = False + self._has_win_bytes = False + self._input_state = InputState.PURE_ASCII + self._last_char = b'' + if self._esc_charset_prober: + self._esc_charset_prober.reset() + for prober in self._charset_probers: + prober.reset() + + def feed(self, byte_str): + """ + Takes a chunk of a document and feeds it through all of the relevant + charset probers. + + After calling ``feed``, you can check the value of the ``done`` + attribute to see if you need to continue feeding the + ``UniversalDetector`` more data, or if it has made a prediction + (in the ``result`` attribute). + + .. note:: + You should always call ``close`` when you're done feeding in your + document if ``done`` is not already ``True``. + """ + if self.done: + return + + if not len(byte_str): + return + + if not isinstance(byte_str, bytearray): + byte_str = bytearray(byte_str) + + # First check for known BOMs, since these are guaranteed to be correct + if not self._got_data: + # If the data starts with BOM, we know it is UTF + if byte_str.startswith(codecs.BOM_UTF8): + # EF BB BF UTF-8 with BOM + self.result = {'encoding': "UTF-8-SIG", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith((codecs.BOM_UTF32_LE, + codecs.BOM_UTF32_BE)): + # FF FE 00 00 UTF-32, little-endian BOM + # 00 00 FE FF UTF-32, big-endian BOM + self.result = {'encoding': "UTF-32", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith(b'\xFE\xFF\x00\x00'): + # FE FF 00 00 UCS-4, unusual octet order BOM (3412) + self.result = {'encoding': "X-ISO-10646-UCS-4-3412", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith(b'\x00\x00\xFF\xFE'): + # 00 00 FF FE UCS-4, unusual octet order BOM (2143) + self.result = {'encoding': "X-ISO-10646-UCS-4-2143", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith((codecs.BOM_LE, codecs.BOM_BE)): + # FF FE UTF-16, little endian BOM + # FE FF UTF-16, big endian BOM + self.result = {'encoding': "UTF-16", + 'confidence': 1.0, + 'language': ''} + + self._got_data = True + if self.result['encoding'] is not None: + self.done = True + return + + # If none of those matched and we've only see ASCII so far, check + # for high bytes and escape sequences + if self._input_state == InputState.PURE_ASCII: + if self.HIGH_BYTE_DETECTOR.search(byte_str): + self._input_state = InputState.HIGH_BYTE + elif self._input_state == InputState.PURE_ASCII and \ + self.ESC_DETECTOR.search(self._last_char + byte_str): + self._input_state = InputState.ESC_ASCII + + self._last_char = byte_str[-1:] + + # If we've seen escape sequences, use the EscCharSetProber, which + # uses a simple state machine to check for known escape sequences in + # HZ and ISO-2022 encodings, since those are the only encodings that + # use such sequences. + if self._input_state == InputState.ESC_ASCII: + if not self._esc_charset_prober: + self._esc_charset_prober = EscCharSetProber(self.lang_filter) + if self._esc_charset_prober.feed(byte_str) == ProbingState.FOUND_IT: + self.result = {'encoding': + self._esc_charset_prober.charset_name, + 'confidence': + self._esc_charset_prober.get_confidence(), + 'language': + self._esc_charset_prober.language} + self.done = True + # If we've seen high bytes (i.e., those with values greater than 127), + # we need to do more complicated checks using all our multi-byte and + # single-byte probers that are left. The single-byte probers + # use character bigram distributions to determine the encoding, whereas + # the multi-byte probers use a combination of character unigram and + # bigram distributions. + elif self._input_state == InputState.HIGH_BYTE: + if not self._charset_probers: + self._charset_probers = [MBCSGroupProber(self.lang_filter)] + # If we're checking non-CJK encodings, use single-byte prober + if self.lang_filter & LanguageFilter.NON_CJK: + self._charset_probers.append(SBCSGroupProber()) + self._charset_probers.append(Latin1Prober()) + for prober in self._charset_probers: + if prober.feed(byte_str) == ProbingState.FOUND_IT: + self.result = {'encoding': prober.charset_name, + 'confidence': prober.get_confidence(), + 'language': prober.language} + self.done = True + break + if self.WIN_BYTE_DETECTOR.search(byte_str): + self._has_win_bytes = True + + def close(self): + """ + Stop analyzing the current document and come up with a final + prediction. + + :returns: The ``result`` attribute, a ``dict`` with the keys + `encoding`, `confidence`, and `language`. + """ + # Don't bother with checks if we're already done + if self.done: + return self.result + self.done = True + + if not self._got_data: + self.logger.debug('no data received!') + + # Default to ASCII if it is all we've seen so far + elif self._input_state == InputState.PURE_ASCII: + self.result = {'encoding': 'ascii', + 'confidence': 1.0, + 'language': ''} + + # If we have seen non-ASCII, return the best that met MINIMUM_THRESHOLD + elif self._input_state == InputState.HIGH_BYTE: + prober_confidence = None + max_prober_confidence = 0.0 + max_prober = None + for prober in self._charset_probers: + if not prober: + continue + prober_confidence = prober.get_confidence() + if prober_confidence > max_prober_confidence: + max_prober_confidence = prober_confidence + max_prober = prober + if max_prober and (max_prober_confidence > self.MINIMUM_THRESHOLD): + charset_name = max_prober.charset_name + lower_charset_name = max_prober.charset_name.lower() + confidence = max_prober.get_confidence() + # Use Windows encoding name instead of ISO-8859 if we saw any + # extra Windows-specific bytes + if lower_charset_name.startswith('iso-8859'): + if self._has_win_bytes: + charset_name = self.ISO_WIN_MAP.get(lower_charset_name, + charset_name) + self.result = {'encoding': charset_name, + 'confidence': confidence, + 'language': max_prober.language} + + # Log all prober confidences if none met MINIMUM_THRESHOLD + if self.logger.getEffectiveLevel() == logging.DEBUG: + if self.result['encoding'] is None: + self.logger.debug('no probers hit minimum threshold') + for group_prober in self._charset_probers: + if not group_prober: + continue + if isinstance(group_prober, CharSetGroupProber): + for prober in group_prober.probers: + self.logger.debug('%s %s confidence = %s', + prober.charset_name, + prober.language, + prober.get_confidence()) + else: + self.logger.debug('%s %s confidence = %s', + prober.charset_name, + prober.language, + prober.get_confidence()) + return self.result diff --git a/cres/venv/lib/python3.8/site-packages/chardet/utf8prober.py b/cres/venv/lib/python3.8/site-packages/chardet/utf8prober.py new file mode 100644 index 000000000..6c3196cc2 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet/utf8prober.py @@ -0,0 +1,82 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState, MachineState +from .codingstatemachine import CodingStateMachine +from .mbcssm import UTF8_SM_MODEL + + + +class UTF8Prober(CharSetProber): + ONE_CHAR_PROB = 0.5 + + def __init__(self): + super(UTF8Prober, self).__init__() + self.coding_sm = CodingStateMachine(UTF8_SM_MODEL) + self._num_mb_chars = None + self.reset() + + def reset(self): + super(UTF8Prober, self).reset() + self.coding_sm.reset() + self._num_mb_chars = 0 + + @property + def charset_name(self): + return "utf-8" + + @property + def language(self): + return "" + + def feed(self, byte_str): + for c in byte_str: + coding_state = self.coding_sm.next_state(c) + if coding_state == MachineState.ERROR: + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + if self.coding_sm.get_current_charlen() >= 2: + self._num_mb_chars += 1 + + if self.state == ProbingState.DETECTING: + if self.get_confidence() > self.SHORTCUT_THRESHOLD: + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + unlike = 0.99 + if self._num_mb_chars < 6: + unlike *= self.ONE_CHAR_PROB ** self._num_mb_chars + return 1.0 - unlike + else: + return unlike diff --git a/cres/venv/lib/python3.8/site-packages/chardet/version.py b/cres/venv/lib/python3.8/site-packages/chardet/version.py new file mode 100644 index 000000000..bb2a34a70 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/chardet/version.py @@ -0,0 +1,9 @@ +""" +This module exists only to simplify retrieving the version number of chardet +from within setup.py and from chardet subpackages. + +:author: Dan Blanchard (dan.blanchard@gmail.com) +""" + +__version__ = "3.0.4" +VERSION = __version__.split('.') diff --git a/cres/venv/lib/python3.8/site-packages/colorama-0.4.3.dist-info/AUTHORS.txt b/cres/venv/lib/python3.8/site-packages/colorama-0.4.3.dist-info/AUTHORS.txt new file mode 100644 index 000000000..72c87d7d3 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/colorama-0.4.3.dist-info/AUTHORS.txt @@ -0,0 +1,562 @@ +A_Rog +Aakanksha Agrawal <11389424+rasponic@users.noreply.github.com> +Abhinav Sagar <40603139+abhinavsagar@users.noreply.github.com> +ABHYUDAY PRATAP SINGH +abs51295 +AceGentile +Adam Chainz +Adam Tse +Adam Tse +Adam Wentz +admin +Adrien Morison +ahayrapetyan +Ahilya +AinsworthK +Akash Srivastava +Alan Yee +Albert Tugushev +Albert-Guan +albertg +Aleks Bunin +Alethea Flowers +Alex Gaynor +Alex Grönholm +Alex Loosley +Alex Morega +Alex Stachowiak +Alexander Shtyrov +Alexandre Conrad +Alexey Popravka +Alexey Popravka +Alli +Ami Fischman +Ananya Maiti +Anatoly Techtonik +Anders Kaseorg +Andreas Lutro +Andrei Geacar +Andrew Gaul +Andrey Bulgakov +Andrés Delfino <34587441+andresdelfino@users.noreply.github.com> +Andrés Delfino +Andy Freeland +Andy Freeland +Andy Kluger +Ani Hayrapetyan +Aniruddha Basak +Anish Tambe +Anrs Hu +Anthony Sottile +Antoine Musso +Anton Ovchinnikov +Anton Patrushev +Antonio Alvarado Hernandez +Antony Lee +Antti Kaihola +Anubhav Patel +Anuj Godase +AQNOUCH Mohammed +AraHaan +Arindam Choudhury +Armin Ronacher +Artem +Ashley Manton +Ashwin Ramaswami +atse +Atsushi Odagiri +Avner Cohen +Baptiste Mispelon +Barney Gale +barneygale +Bartek Ogryczak +Bastian Venthur +Ben Darnell +Ben Hoyt +Ben Rosser +Bence Nagy +Benjamin Peterson +Benjamin VanEvery +Benoit Pierre +Berker Peksag +Bernardo B. Marques +Bernhard M. Wiedemann +Bertil Hatt +Bogdan Opanchuk +BorisZZZ +Brad Erickson +Bradley Ayers +Brandon L. Reiss +Brandt Bucher +Brett Randall +Brian Cristante <33549821+brcrista@users.noreply.github.com> +Brian Cristante +Brian Rosner +BrownTruck +Bruno Oliveira +Bruno Renié +Bstrdsmkr +Buck Golemon +burrows +Bussonnier Matthias +c22 +Caleb Martinez +Calvin Smith +Carl Meyer +Carlos Liam +Carol Willing +Carter Thayer +Cass +Chandrasekhar Atina +Chih-Hsuan Yen +Chih-Hsuan Yen +Chris Brinker +Chris Hunt +Chris Jerdonek +Chris McDonough +Chris Wolfe +Christian Heimes +Christian Oudard +Christopher Hunt +Christopher Snyder +Clark Boylan +Clay McClure +Cody +Cody Soyland +Colin Watson +Connor Osborn +Cooper Lees +Cooper Ry Lees +Cory Benfield +Cory Wright +Craig Kerstiens +Cristian Sorinel +Curtis Doty +cytolentino +Damian Quiroga +Dan Black +Dan Savilonis +Dan Sully +daniel +Daniel Collins +Daniel Hahler +Daniel Holth +Daniel Jost +Daniel Shaulov +Daniele Esposti +Daniele Procida +Danny Hermes +Dav Clark +Dave Abrahams +Dave Jones +David Aguilar +David Black +David Bordeynik +David Bordeynik +David Caro +David Evans +David Linke +David Pursehouse +David Tucker +David Wales +Davidovich +derwolfe +Desetude +Diego Caraballo +DiegoCaraballo +Dmitry Gladkov +Domen Kožar +Donald Stufft +Dongweiming +Douglas Thor +DrFeathers +Dustin Ingram +Dwayne Bailey +Ed Morley <501702+edmorley@users.noreply.github.com> +Ed Morley +Eitan Adler +ekristina +elainechan +Eli Schwartz +Eli Schwartz +Emil Burzo +Emil Styrke +Endoh Takanao +enoch +Erdinc Mutlu +Eric Gillingham +Eric Hanchrow +Eric Hopper +Erik M. Bray +Erik Rose +Ernest W Durbin III +Ernest W. Durbin III +Erwin Janssen +Eugene Vereshchagin +everdimension +Felix Yan +fiber-space +Filip Kokosiński +Florian Briand +Florian Rathgeber +Francesco +Francesco Montesano +Frost Ming +Gabriel Curio +Gabriel de Perthuis +Garry Polley +gdanielson +Geoffrey Lehée +Geoffrey Sneddon +George Song +Georgi Valkov +Giftlin Rajaiah +gizmoguy1 +gkdoc <40815324+gkdoc@users.noreply.github.com> +Gopinath M <31352222+mgopi1990@users.noreply.github.com> +GOTO Hayato <3532528+gh640@users.noreply.github.com> +gpiks +Guilherme Espada +Guy Rozendorn +gzpan123 +Hanjun Kim +Hari Charan +Harsh Vardhan +Herbert Pfennig +Hsiaoming Yang +Hugo +Hugo Lopes Tavares +Hugo van Kemenade +hugovk +Hynek Schlawack +Ian Bicking +Ian Cordasco +Ian Lee +Ian Stapleton Cordasco +Ian Wienand +Ian Wienand +Igor Kuzmitshov +Igor Sobreira +Ilya Baryshev +INADA Naoki +Ionel Cristian Mărieș +Ionel Maries Cristian +Ivan Pozdeev +Jacob Kim +jakirkham +Jakub Stasiak +Jakub Vysoky +Jakub Wilk +James Cleveland +James Cleveland +James Firth +James Polley +Jan Pokorný +Jannis Leidel +jarondl +Jason R. Coombs +Jay Graves +Jean-Christophe Fillion-Robin +Jeff Barber +Jeff Dairiki +Jelmer Vernooij +jenix21 +Jeremy Stanley +Jeremy Zafran +Jiashuo Li +Jim Garrison +Jivan Amara +John Paton +John-Scott Atlakson +johnthagen +johnthagen +Jon Banafato +Jon Dufresne +Jon Parise +Jonas Nockert +Jonathan Herbert +Joost Molenaar +Jorge Niedbalski +Joseph Long +Josh Bronson +Josh Hansen +Josh Schneier +Juanjo Bazán +Julian Berman +Julian Gethmann +Julien Demoor +jwg4 +Jyrki Pulliainen +Kai Chen +Kamal Bin Mustafa +kaustav haldar +keanemind +Keith Maxwell +Kelsey Hightower +Kenneth Belitzky +Kenneth Reitz +Kenneth Reitz +Kevin Burke +Kevin Carter +Kevin Frommelt +Kevin R Patterson +Kexuan Sun +Kit Randel +kpinc +Krishna Oza +Kumar McMillan +Kyle Persohn +lakshmanaram +Laszlo Kiss-Kollar +Laurent Bristiel +Laurie Opperman +Leon Sasson +Lev Givon +Lincoln de Sousa +Lipis +Loren Carvalho +Lucas Cimon +Ludovic Gasc +Luke Macken +Luo Jiebin +luojiebin +luz.paz +László Kiss Kollár +László Kiss Kollár +Marc Abramowitz +Marc Tamlyn +Marcus Smith +Mariatta +Mark Kohler +Mark Williams +Mark Williams +Markus Hametner +Masaki +Masklinn +Matej Stuchlik +Mathew Jennings +Mathieu Bridon +Matt Good +Matt Maker +Matt Robenolt +matthew +Matthew Einhorn +Matthew Gilliard +Matthew Iversen +Matthew Trumbell +Matthew Willson +Matthias Bussonnier +mattip +Maxim Kurnikov +Maxime Rouyrre +mayeut +mbaluna <44498973+mbaluna@users.noreply.github.com> +mdebi <17590103+mdebi@users.noreply.github.com> +memoselyk +Michael +Michael Aquilina +Michael E. Karpeles +Michael Klich +Michael Williamson +michaelpacer +Mickaël Schoentgen +Miguel Araujo Perez +Mihir Singh +Mike +Mike Hendricks +Min RK +MinRK +Miro Hrončok +Monica Baluna +montefra +Monty Taylor +Nate Coraor +Nathaniel J. Smith +Nehal J Wani +Neil Botelho +Nick Coghlan +Nick Stenning +Nick Timkovich +Nicolas Bock +Nikhil Benesch +Nitesh Sharma +Nowell Strite +NtaleGrey +nvdv +Ofekmeister +ofrinevo +Oliver Jeeves +Oliver Tonnhofer +Olivier Girardot +Olivier Grisel +Ollie Rutherfurd +OMOTO Kenji +Omry Yadan +Oren Held +Oscar Benjamin +Oz N Tiram +Pachwenko <32424503+Pachwenko@users.noreply.github.com> +Patrick Dubroy +Patrick Jenkins +Patrick Lawson +patricktokeeffe +Patrik Kopkan +Paul Kehrer +Paul Moore +Paul Nasrat +Paul Oswald +Paul van der Linden +Paulus Schoutsen +Pavithra Eswaramoorthy <33131404+QueenCoffee@users.noreply.github.com> +Pawel Jasinski +Pekka Klärck +Peter Lisák +Peter Waller +petr-tik +Phaneendra Chiruvella +Phil Freo +Phil Pennock +Phil Whelan +Philip Jägenstedt +Philip Molloy +Philippe Ombredanne +Pi Delport +Pierre-Yves Rofes +pip +Prabakaran Kumaresshan +Prabhjyotsing Surjit Singh Sodhi +Prabhu Marappan +Pradyun Gedam +Pratik Mallya +Preet Thakkar +Preston Holmes +Przemek Wrzos +Pulkit Goyal <7895pulkit@gmail.com> +Qiangning Hong +Quentin Pradet +R. David Murray +Rafael Caricio +Ralf Schmitt +Razzi Abuissa +rdb +Remi Rampin +Remi Rampin +Rene Dudfield +Riccardo Magliocchetti +Richard Jones +RobberPhex +Robert Collins +Robert McGibbon +Robert T. McGibbon +robin elisha robinson +Roey Berman +Rohan Jain +Rohan Jain +Rohan Jain +Roman Bogorodskiy +Romuald Brunet +Ronny Pfannschmidt +Rory McCann +Ross Brattain +Roy Wellington Ⅳ +Roy Wellington Ⅳ +Ryan Wooden +ryneeverett +Sachi King +Salvatore Rinchiera +Savio Jomton +schlamar +Scott Kitterman +Sean +seanj +Sebastian Jordan +Sebastian Schaetz +Segev Finer +SeongSoo Cho +Sergey Vasilyev +Seth Woodworth +Shlomi Fish +Shovan Maity +Simeon Visser +Simon Cross +Simon Pichugin +sinoroc +Sorin Sbarnea +Stavros Korokithakis +Stefan Scherfke +Stephan Erb +stepshal +Steve (Gadget) Barnes +Steve Barnes +Steve Dower +Steve Kowalik +Steven Myint +stonebig +Stéphane Bidoul (ACSONE) +Stéphane Bidoul +Stéphane Klein +Sumana Harihareswara +Sviatoslav Sydorenko +Sviatoslav Sydorenko +Swat009 +Takayuki SHIMIZUKAWA +tbeswick +Thijs Triemstra +Thomas Fenzl +Thomas Grainger +Thomas Guettler +Thomas Johansson +Thomas Kluyver +Thomas Smith +Tim D. Smith +Tim Gates +Tim Harder +Tim Heap +tim smith +tinruufu +Tom Forbes +Tom Freudenheim +Tom V +Tomas Orsava +Tomer Chachamu +Tony Beswick +Tony Zhaocheng Tan +TonyBeswick +toonarmycaptain +Toshio Kuratomi +Travis Swicegood +Tzu-ping Chung +Valentin Haenel +Victor Stinner +victorvpaulo +Viktor Szépe +Ville Skyttä +Vinay Sajip +Vincent Philippon +Vinicyus Macedo <7549205+vinicyusmacedo@users.noreply.github.com> +Vitaly Babiy +Vladimir Rutsky +W. Trevor King +Wil Tan +Wilfred Hughes +William ML Leslie +William T Olson +Wilson Mo +wim glenn +Wolfgang Maier +Xavier Fernandez +Xavier Fernandez +xoviat +xtreak +YAMAMOTO Takashi +Yen Chi Hsuan +Yeray Diaz Diaz +Yoval P +Yu Jian +Yuan Jing Vincent Yan +Zearin +Zearin +Zhiping Deng +Zvezdan Petkovic +Łukasz Langa +Семён Марьясин diff --git a/cres/venv/lib/python3.8/site-packages/colorama-0.4.3.dist-info/INSTALLER b/cres/venv/lib/python3.8/site-packages/colorama-0.4.3.dist-info/INSTALLER new file mode 100644 index 000000000..a1b589e38 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/colorama-0.4.3.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/cres/venv/lib/python3.8/site-packages/colorama-0.4.3.dist-info/LICENSE.txt b/cres/venv/lib/python3.8/site-packages/colorama-0.4.3.dist-info/LICENSE.txt new file mode 100644 index 000000000..737fec5c5 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/colorama-0.4.3.dist-info/LICENSE.txt @@ -0,0 +1,20 @@ +Copyright (c) 2008-2019 The pip developers (see AUTHORS.txt file) + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/cres/venv/lib/python3.8/site-packages/colorama-0.4.3.dist-info/METADATA b/cres/venv/lib/python3.8/site-packages/colorama-0.4.3.dist-info/METADATA new file mode 100644 index 000000000..c455cb515 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/colorama-0.4.3.dist-info/METADATA @@ -0,0 +1,411 @@ +Metadata-Version: 2.1 +Name: colorama +Version: 0.4.3 +Summary: Cross-platform colored terminal text. +Home-page: https://github.com/tartley/colorama +Author: Jonathan Hartley +Author-email: tartley@tartley.com +Maintainer: Arnon Yaari +License: BSD +Keywords: color colour terminal text ansi windows crossplatform xplatform +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Console +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +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.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Terminals +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.* + +.. image:: https://img.shields.io/pypi/v/colorama.svg + :target: https://pypi.org/project/colorama/ + :alt: Latest Version + +.. image:: https://img.shields.io/pypi/pyversions/colorama.svg + :target: https://pypi.org/project/colorama/ + :alt: Supported Python versions + +.. image:: https://travis-ci.org/tartley/colorama.svg?branch=master + :target: https://travis-ci.org/tartley/colorama + :alt: Build Status + +Download and docs: + https://pypi.org/project/colorama/ +Source code & Development: + https://github.com/tartley/colorama +Colorama for Enterprise: + https://github.com/tartley/colorama/blob/master/ENTERPRISE.md + +Description +=========== + +Makes ANSI escape character sequences (for producing colored terminal text and +cursor positioning) work under MS Windows. + +ANSI escape character sequences have long been used to produce colored terminal +text and cursor positioning on Unix and Macs. Colorama makes this work on +Windows, too, by wrapping ``stdout``, stripping ANSI sequences it finds (which +would appear as gobbledygook in the output), and converting them into the +appropriate win32 calls to modify the state of the terminal. On other platforms, +Colorama does nothing. + +Colorama also provides some shortcuts to help generate ANSI sequences +but works fine in conjunction with any other ANSI sequence generation library, +such as the venerable Termcolor (https://pypi.org/project/termcolor/) +or the fabulous Blessings (https://pypi.org/project/blessings/). + +This has the upshot of providing a simple cross-platform API for printing +colored terminal text from Python, and has the happy side-effect that existing +applications or libraries which use ANSI sequences to produce colored output on +Linux or Macs can now also work on Windows, simply by calling +``colorama.init()``. + +An alternative approach is to install ``ansi.sys`` on Windows machines, which +provides the same behaviour for all applications running in terminals. Colorama +is intended for situations where that isn't easy (e.g., maybe your app doesn't +have an installer.) + +Demo scripts in the source code repository print some colored text using +ANSI sequences. Compare their output under Gnome-terminal's built in ANSI +handling, versus on Windows Command-Prompt using Colorama: + +.. image:: https://github.com/tartley/colorama/raw/master/screenshots/ubuntu-demo.png + :width: 661 + :height: 357 + :alt: ANSI sequences on Ubuntu under gnome-terminal. + +.. image:: https://github.com/tartley/colorama/raw/master/screenshots/windows-demo.png + :width: 668 + :height: 325 + :alt: Same ANSI sequences on Windows, using Colorama. + +These screengrabs show that, on Windows, Colorama does not support ANSI 'dim +text'; it looks the same as 'normal text'. + + +License +======= + +Copyright Jonathan Hartley & Arnon Yaari, 2013. BSD 3-Clause license; see LICENSE file. + + +Dependencies +============ + +None, other than Python. Tested on Python 2.7, 3.5, 3.6, 3.7 and 3.8. + +Usage +===== + +Initialisation +-------------- + +Applications should initialise Colorama using: + +.. code-block:: python + + from colorama import init + init() + +On Windows, calling ``init()`` will filter ANSI escape sequences out of any +text sent to ``stdout`` or ``stderr``, and replace them with equivalent Win32 +calls. + +On other platforms, calling ``init()`` has no effect (unless you request other +optional functionality; see "Init Keyword Args", below). By design, this permits +applications to call ``init()`` unconditionally on all platforms, after which +ANSI output should just work. + +To stop using colorama before your program exits, simply call ``deinit()``. +This will restore ``stdout`` and ``stderr`` to their original values, so that +Colorama is disabled. To resume using Colorama again, call ``reinit()``; it is +cheaper to calling ``init()`` again (but does the same thing). + + +Colored Output +-------------- + +Cross-platform printing of colored text can then be done using Colorama's +constant shorthand for ANSI escape sequences: + +.. code-block:: python + + from colorama import Fore, Back, Style + print(Fore.RED + 'some red text') + print(Back.GREEN + 'and with a green background') + print(Style.DIM + 'and in dim text') + print(Style.RESET_ALL) + print('back to normal now') + +...or simply by manually printing ANSI sequences from your own code: + +.. code-block:: python + + print('\033[31m' + 'some red text') + print('\033[39m') # and reset to default color + +...or, Colorama can be used happily in conjunction with existing ANSI libraries +such as Termcolor: + +.. code-block:: python + + from colorama import init + from termcolor import colored + + # use Colorama to make Termcolor work on Windows too + init() + + # then use Termcolor for all colored text output + print(colored('Hello, World!', 'green', 'on_red')) + +Available formatting constants are:: + + Fore: BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, RESET. + Back: BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, RESET. + Style: DIM, NORMAL, BRIGHT, RESET_ALL + +``Style.RESET_ALL`` resets foreground, background, and brightness. Colorama will +perform this reset automatically on program exit. + + +Cursor Positioning +------------------ + +ANSI codes to reposition the cursor are supported. See ``demos/demo06.py`` for +an example of how to generate them. + + +Init Keyword Args +----------------- + +``init()`` accepts some ``**kwargs`` to override default behaviour. + +init(autoreset=False): + If you find yourself repeatedly sending reset sequences to turn off color + changes at the end of every print, then ``init(autoreset=True)`` will + automate that: + + .. code-block:: python + + from colorama import init + init(autoreset=True) + print(Fore.RED + 'some red text') + print('automatically back to default color again') + +init(strip=None): + Pass ``True`` or ``False`` to override whether ansi codes should be + stripped from the output. The default behaviour is to strip if on Windows + or if output is redirected (not a tty). + +init(convert=None): + Pass ``True`` or ``False`` to override whether to convert ANSI codes in the + output into win32 calls. The default behaviour is to convert if on Windows + and output is to a tty (terminal). + +init(wrap=True): + On Windows, colorama works by replacing ``sys.stdout`` and ``sys.stderr`` + with proxy objects, which override the ``.write()`` method to do their work. + If this wrapping causes you problems, then this can be disabled by passing + ``init(wrap=False)``. The default behaviour is to wrap if ``autoreset`` or + ``strip`` or ``convert`` are True. + + When wrapping is disabled, colored printing on non-Windows platforms will + continue to work as normal. To do cross-platform colored output, you can + use Colorama's ``AnsiToWin32`` proxy directly: + + .. code-block:: python + + import sys + from colorama import init, AnsiToWin32 + init(wrap=False) + stream = AnsiToWin32(sys.stderr).stream + + # Python 2 + print >>stream, Fore.BLUE + 'blue text on stderr' + + # Python 3 + print(Fore.BLUE + 'blue text on stderr', file=stream) + + +Installation +======================= +colorama is currently installable from PyPI: + + pip install colorama + +colorama also can be installed by the conda package manager: + + conda install -c anaconda colorama + + +Status & Known Problems +======================= + +I've personally only tested it on Windows XP (CMD, Console2), Ubuntu +(gnome-terminal, xterm), and OS X. + +Some presumably valid ANSI sequences aren't recognised (see details below), +but to my knowledge nobody has yet complained about this. Puzzling. + +See outstanding issues and wishlist: +https://github.com/tartley/colorama/issues + +If anything doesn't work for you, or doesn't do what you expected or hoped for, +I'd love to hear about it on that issues list, would be delighted by patches, +and would be happy to grant commit access to anyone who submits a working patch +or two. + + +Recognised ANSI Sequences +========================= + +ANSI sequences generally take the form: + + ESC [ ; ... + +Where ```` is an integer, and ```` is a single letter. Zero or +more params are passed to a ````. If no params are passed, it is +generally synonymous with passing a single zero. No spaces exist in the +sequence; they have been inserted here simply to read more easily. + +The only ANSI sequences that colorama converts into win32 calls are:: + + ESC [ 0 m # reset all (colors and brightness) + ESC [ 1 m # bright + ESC [ 2 m # dim (looks same as normal brightness) + ESC [ 22 m # normal brightness + + # FOREGROUND: + ESC [ 30 m # black + ESC [ 31 m # red + ESC [ 32 m # green + ESC [ 33 m # yellow + ESC [ 34 m # blue + ESC [ 35 m # magenta + ESC [ 36 m # cyan + ESC [ 37 m # white + ESC [ 39 m # reset + + # BACKGROUND + ESC [ 40 m # black + ESC [ 41 m # red + ESC [ 42 m # green + ESC [ 43 m # yellow + ESC [ 44 m # blue + ESC [ 45 m # magenta + ESC [ 46 m # cyan + ESC [ 47 m # white + ESC [ 49 m # reset + + # cursor positioning + ESC [ y;x H # position cursor at x across, y down + ESC [ y;x f # position cursor at x across, y down + ESC [ n A # move cursor n lines up + ESC [ n B # move cursor n lines down + ESC [ n C # move cursor n characters forward + ESC [ n D # move cursor n characters backward + + # clear the screen + ESC [ mode J # clear the screen + + # clear the line + ESC [ mode K # clear the line + +Multiple numeric params to the ``'m'`` command can be combined into a single +sequence:: + + ESC [ 36 ; 45 ; 1 m # bright cyan text on magenta background + +All other ANSI sequences of the form ``ESC [ ; ... `` +are silently stripped from the output on Windows. + +Any other form of ANSI sequence, such as single-character codes or alternative +initial characters, are not recognised or stripped. It would be cool to add +them though. Let me know if it would be useful for you, via the Issues on +GitHub. + + +Development +=========== + +Help and fixes welcome! + +Running tests requires: + +- Michael Foord's ``mock`` module to be installed. +- Tests are written using 2010-era updates to ``unittest`` + +To run tests:: + + python -m unittest discover -p *_test.py + +This, like a few other handy commands, is captured in a ``Makefile``. + +If you use nose to run the tests, you must pass the ``-s`` flag; otherwise, +``nosetests`` applies its own proxy to ``stdout``, which confuses the unit +tests. + + +Professional support +==================== + +.. |tideliftlogo| image:: https://cdn2.hubspot.net/hubfs/4008838/website/logos/logos_for_download/Tidelift_primary-shorthand-logo.png + :alt: Tidelift + :target: https://tidelift.com/subscription/pkg/pypi-colorama?utm_source=pypi-colorama&utm_medium=referral&utm_campaign=readme + +.. list-table:: + :widths: 10 100 + + * - |tideliftlogo| + - Professional support for colorama is available as part of the + `Tidelift Subscription`_. + Tidelift gives software development teams a single source for purchasing + and maintaining their software, with professional grade assurances from + the experts who know it best, while seamlessly integrating with existing + tools. + +.. _Tidelift Subscription: https://tidelift.com/subscription/pkg/pypi-colorama?utm_source=pypi-colorama&utm_medium=referral&utm_campaign=readme + + +Thanks +====== +* Marc Schlaich (schlamar) for a ``setup.py`` fix for Python2.5. +* Marc Abramowitz, reported & fixed a crash on exit with closed ``stdout``, + providing a solution to issue #7's setuptools/distutils debate, + and other fixes. +* User 'eryksun', for guidance on correctly instantiating ``ctypes.windll``. +* Matthew McCormick for politely pointing out a longstanding crash on non-Win. +* Ben Hoyt, for a magnificent fix under 64-bit Windows. +* Jesse at Empty Square for submitting a fix for examples in the README. +* User 'jamessp', an observant documentation fix for cursor positioning. +* User 'vaal1239', Dave Mckee & Lackner Kristof for a tiny but much-needed Win7 + fix. +* Julien Stuyck, for wisely suggesting Python3 compatible updates to README. +* Daniel Griffith for multiple fabulous patches. +* Oscar Lesta for a valuable fix to stop ANSI chars being sent to non-tty + output. +* Roger Binns, for many suggestions, valuable feedback, & bug reports. +* Tim Golden for thought and much appreciated feedback on the initial idea. +* User 'Zearin' for updates to the README file. +* John Szakmeister for adding support for light colors +* Charles Merriam for adding documentation to demos +* Jurko for a fix on 64-bit Windows CPython2.5 w/o ctypes +* Florian Bruhin for a fix when stdout or stderr are None +* Thomas Weininger for fixing ValueError on Windows +* Remi Rampin for better Github integration and fixes to the README file +* Simeon Visser for closing a file handle using 'with' and updating classifiers + to include Python 3.3 and 3.4 +* Andy Neff for fixing RESET of LIGHT_EX colors. +* Jonathan Hartley for the initial idea and implementation. + + diff --git a/cres/venv/lib/python3.8/site-packages/colorama-0.4.3.dist-info/RECORD b/cres/venv/lib/python3.8/site-packages/colorama-0.4.3.dist-info/RECORD new file mode 100644 index 000000000..268c5db36 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/colorama-0.4.3.dist-info/RECORD @@ -0,0 +1,22 @@ +colorama/__init__.py,sha256=DqjXH9URVP3IJwmMt7peYw50ns1RNAymIB9-XdPEFV8,239 +colorama/ansi.py,sha256=Fi0un-QLqRm-v7o_nKiOqyC8PapBJK7DLV_q9LKtTO0,2524 +colorama/ansitowin32.py,sha256=u8QaqdqS_xYSfNkPM1eRJLHz6JMWPodaJaP0mxgHCDc,10462 +colorama/initialise.py,sha256=PprovDNxMTrvoNHFcL2NZjpH2XzDc8BLxLxiErfUl4k,1915 +colorama/win32.py,sha256=bJ8Il9jwaBN5BJ8bmN6FoYZ1QYuMKv2j8fGrXh7TJjw,5404 +colorama/winterm.py,sha256=2y_2b7Zsv34feAsP67mLOVc-Bgq51mdYGo571VprlrM,6438 +colorama-0.4.3.dist-info/AUTHORS.txt,sha256=RtqU9KfonVGhI48DAA4-yTOBUhBtQTjFhaDzHoyh7uU,21518 +colorama-0.4.3.dist-info/LICENSE.txt,sha256=W6Ifuwlk-TatfRU2LR7W1JMcyMj5_y1NkRkOEJvnRDE,1090 +colorama-0.4.3.dist-info/METADATA,sha256=-ovqULHfBHs9pV2e_Ua8-w2VSVLno-6x36SXSTsWvSc,14432 +colorama-0.4.3.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110 +colorama-0.4.3.dist-info/top_level.txt,sha256=_Kx6-Cni2BT1PEATPhrSRxo0d7kSgfBbHf5o7IF1ABw,9 +colorama-0.4.3.dist-info/RECORD,, +colorama/win32.cpython-38.pyc,, +colorama/__init__.cpython-38.pyc,, +colorama-0.4.3.dist-info/__pycache__,, +colorama/__pycache__,, +colorama/winterm.cpython-38.pyc,, +colorama/initialise.cpython-38.pyc,, +colorama-0.4.3.virtualenv,, +colorama/ansi.cpython-38.pyc,, +colorama/ansitowin32.cpython-38.pyc,, +colorama-0.4.3.dist-info/INSTALLER,, \ No newline at end of file diff --git a/cres/venv/lib/python3.8/site-packages/colorama-0.4.3.dist-info/WHEEL b/cres/venv/lib/python3.8/site-packages/colorama-0.4.3.dist-info/WHEEL new file mode 100644 index 000000000..ef99c6cf3 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/colorama-0.4.3.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.34.2) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/cres/venv/lib/python3.8/site-packages/colorama-0.4.3.dist-info/top_level.txt b/cres/venv/lib/python3.8/site-packages/colorama-0.4.3.dist-info/top_level.txt new file mode 100644 index 000000000..3fcfb51b2 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/colorama-0.4.3.dist-info/top_level.txt @@ -0,0 +1 @@ +colorama diff --git a/cres/venv/lib/python3.8/site-packages/colorama-0.4.3.virtualenv b/cres/venv/lib/python3.8/site-packages/colorama-0.4.3.virtualenv new file mode 100644 index 000000000..e69de29bb diff --git a/cres/venv/lib/python3.8/site-packages/colorama/__init__.py b/cres/venv/lib/python3.8/site-packages/colorama/__init__.py new file mode 100644 index 000000000..34c263cc8 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/colorama/__init__.py @@ -0,0 +1,6 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +from .initialise import init, deinit, reinit, colorama_text +from .ansi import Fore, Back, Style, Cursor +from .ansitowin32 import AnsiToWin32 + +__version__ = '0.4.3' diff --git a/cres/venv/lib/python3.8/site-packages/colorama/__pycache__/__init__.cpython-38.pyc b/cres/venv/lib/python3.8/site-packages/colorama/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9fe84dd3360a51eed4f8c27f2d1ce16033ce4fbb GIT binary patch literal 456 zcmYk2y-ve05XX}=Nk7u;eT5E*5oKUNh%YfBq=JwtVj72- zkD5fKG*w;NRXy5MecJ!ccbb99Xy)%R9oES-7^k11A2p6$EL&+^T8o{BozE-XXyA%7 zE1oTuU1|_6KI7GsOQv?)2$!C(z-SnUE<0_FywP{Eo$S9Pd*wknxf2z}2{nv9$mrb<5am06CT-zJV;X668Va83%F= z`cYKYkj-XOEO$X6TPx;uuvK6fg=$;V}9EhPi!u literal 0 HcmV?d00001 diff --git a/cres/venv/lib/python3.8/site-packages/colorama/__pycache__/ansi.cpython-38.pyc b/cres/venv/lib/python3.8/site-packages/colorama/__pycache__/ansi.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..056d6685524d4c0ca285b3cf2d038d35c84ecd98 GIT binary patch literal 3241 zcmc&$-A~(A6!*2A#Bn}JDXi_ZWnWsejaX}?X=_AJRSYw!i0UFVmjeLRDL(nypctrrs#FPSZ34_Z0nrW~upx*lBu&=4c*PnFWOw zXz`6gi_AFC>@3hFS_Zl-X%pxPS^>JkvcS&)eThy2Jt^rt(3j~H&{L8wu-t)S7g-*# z#0r3AW&%#o>8?_{y7!y8y6J`0t$=R#S#^W?jJpvFtBp=~vD({ox!a2vul52852K(u z;GQ3O{suhh2V6b^{+8#v{jhF!8M{^8jH1CU%VK_g$9v%o81>wGz&9+UER^f8u;&h# zgF?+c_1YttkKd6@kATmH1J@eNCd{x55GfJaR}RQDxO7^9k5@Z_Y#pjXYjzif7Dl{A zgpM)~6`p|?-uc#Mu*IxrLGaY&)-n&CvtAThJ3BiwgM^p?W7q~*>;?Wz7`Z-mISs8I zXQB0q`LC?L_tYBfMw@|uv;MsmdJ&r$xV;zd25gWXaJO8`^+T^d*cAm-?nHruehc&X z;VOVaIAn@)$~xqYScg{aE7M@*k#&3OjoURaZ>if9+FYv*=A|Mp>N9Cw0tUzs*^ot! zMX!IMjfXV|GQg%@WgkbwP~15eEmCs z2tsi{=9S0SUz2_EmQeCL35`hISN6$)`dW=NTt)i6dO!{|qP#TdFeRN@N@&#M!i0q4 zQMltpnsZe0#l}uK_q?3 z)#$HT+;j)v*wqCJT@HGfMvJo35$JR!+3N`Ox-vCrR`$9HYSJ9`I+}-|RD>zb*ydrt zV=Vg~MshfCjp}4*j{5)^>jRA>VO4$&whH2pm?ld^U0ePFI7hXyS9q_nzP5Y;eRE05 zqReqs`ux&*=gSdgr4ePwyMVgp`RX!vmsZvrEAzDxjY(ceht`kS7f?EXzEXXz(Y*il zh{jPHk=MhJ4F|4|L--*OvXw*SB&{6UdJ;}mHa@NMj@%aHp448`jw1T2AiLw9)|QvL zGazml)#8Ywfz_!I{u!{(zNwOzY%uu8u#Z;}K0(0nar7uhBRMMJHxOiREbm~OR5I)%rM>r`@V%4qLU1wk6+r!Cmi?xKjEE&6G(g= z)W?{j@mC0#r|~xkn5=Of!9qZjVv4{Jo*`@?Y$A9F&kypD zr_pYoX%(7}xh{XJ!L64sR8aaU2@-9Eal(pJT1_96}ZW4_h3MKO7GqA{{)% zv!?uc%03{og`-oXbfII3LV-XeMM_#J(oNa0&-zYb{E+;{@2DUltODpMnU0zPm#LY0 PIae-}r{GGb310sIP4jwJ literal 0 HcmV?d00001 diff --git a/cres/venv/lib/python3.8/site-packages/colorama/__pycache__/ansitowin32.cpython-38.pyc b/cres/venv/lib/python3.8/site-packages/colorama/__pycache__/ansitowin32.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0af2b56a8d6211d7e2884f43040839d10aa61ecd GIT binary patch literal 7750 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 EA6i~#6aWAK literal 0 HcmV?d00001 diff --git a/cres/venv/lib/python3.8/site-packages/colorama/__pycache__/win32.cpython-38.pyc b/cres/venv/lib/python3.8/site-packages/colorama/__pycache__/win32.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b72657752a70617f7bdaa9aa629977a95a2eea30 GIT binary patch literal 3993 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 S^gkq@QyA3QylhrV73+W6gtv(R literal 0 HcmV?d00001 diff --git a/cres/venv/lib/python3.8/site-packages/colorama/ansi.py b/cres/venv/lib/python3.8/site-packages/colorama/ansi.py new file mode 100644 index 000000000..78776588d --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/colorama/ansi.py @@ -0,0 +1,102 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +''' +This module generates ANSI character codes to printing colors to terminals. +See: http://en.wikipedia.org/wiki/ANSI_escape_code +''' + +CSI = '\033[' +OSC = '\033]' +BEL = '\007' + + +def code_to_chars(code): + return CSI + str(code) + 'm' + +def set_title(title): + return OSC + '2;' + title + BEL + +def clear_screen(mode=2): + return CSI + str(mode) + 'J' + +def clear_line(mode=2): + return CSI + str(mode) + 'K' + + +class AnsiCodes(object): + def __init__(self): + # the subclasses declare class attributes which are numbers. + # Upon instantiation we define instance attributes, which are the same + # as the class attributes but wrapped with the ANSI escape sequence + for name in dir(self): + if not name.startswith('_'): + value = getattr(self, name) + setattr(self, name, code_to_chars(value)) + + +class AnsiCursor(object): + def UP(self, n=1): + return CSI + str(n) + 'A' + def DOWN(self, n=1): + return CSI + str(n) + 'B' + def FORWARD(self, n=1): + return CSI + str(n) + 'C' + def BACK(self, n=1): + return CSI + str(n) + 'D' + def POS(self, x=1, y=1): + return CSI + str(y) + ';' + str(x) + 'H' + + +class AnsiFore(AnsiCodes): + BLACK = 30 + RED = 31 + GREEN = 32 + YELLOW = 33 + BLUE = 34 + MAGENTA = 35 + CYAN = 36 + WHITE = 37 + RESET = 39 + + # These are fairly well supported, but not part of the standard. + LIGHTBLACK_EX = 90 + LIGHTRED_EX = 91 + LIGHTGREEN_EX = 92 + LIGHTYELLOW_EX = 93 + LIGHTBLUE_EX = 94 + LIGHTMAGENTA_EX = 95 + LIGHTCYAN_EX = 96 + LIGHTWHITE_EX = 97 + + +class AnsiBack(AnsiCodes): + BLACK = 40 + RED = 41 + GREEN = 42 + YELLOW = 43 + BLUE = 44 + MAGENTA = 45 + CYAN = 46 + WHITE = 47 + RESET = 49 + + # These are fairly well supported, but not part of the standard. + LIGHTBLACK_EX = 100 + LIGHTRED_EX = 101 + LIGHTGREEN_EX = 102 + LIGHTYELLOW_EX = 103 + LIGHTBLUE_EX = 104 + LIGHTMAGENTA_EX = 105 + LIGHTCYAN_EX = 106 + LIGHTWHITE_EX = 107 + + +class AnsiStyle(AnsiCodes): + BRIGHT = 1 + DIM = 2 + NORMAL = 22 + RESET_ALL = 0 + +Fore = AnsiFore() +Back = AnsiBack() +Style = AnsiStyle() +Cursor = AnsiCursor() diff --git a/cres/venv/lib/python3.8/site-packages/colorama/ansitowin32.py b/cres/venv/lib/python3.8/site-packages/colorama/ansitowin32.py new file mode 100644 index 000000000..359c92be5 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/colorama/ansitowin32.py @@ -0,0 +1,257 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +import re +import sys +import os + +from .ansi import AnsiFore, AnsiBack, AnsiStyle, Style +from .winterm import WinTerm, WinColor, WinStyle +from .win32 import windll, winapi_test + + +winterm = None +if windll is not None: + winterm = WinTerm() + + +class StreamWrapper(object): + ''' + Wraps a stream (such as stdout), acting as a transparent proxy for all + attribute access apart from method 'write()', which is delegated to our + Converter instance. + ''' + def __init__(self, wrapped, converter): + # double-underscore everything to prevent clashes with names of + # attributes on the wrapped stream object. + self.__wrapped = wrapped + self.__convertor = converter + + def __getattr__(self, name): + return getattr(self.__wrapped, name) + + def __enter__(self, *args, **kwargs): + # special method lookup bypasses __getattr__/__getattribute__, see + # https://stackoverflow.com/questions/12632894/why-doesnt-getattr-work-with-exit + # thus, contextlib magic methods are not proxied via __getattr__ + return self.__wrapped.__enter__(*args, **kwargs) + + def __exit__(self, *args, **kwargs): + return self.__wrapped.__exit__(*args, **kwargs) + + def write(self, text): + self.__convertor.write(text) + + def isatty(self): + stream = self.__wrapped + if 'PYCHARM_HOSTED' in os.environ: + if stream is not None and (stream is sys.__stdout__ or stream is sys.__stderr__): + return True + try: + stream_isatty = stream.isatty + except AttributeError: + return False + else: + return stream_isatty() + + @property + def closed(self): + stream = self.__wrapped + try: + return stream.closed + except AttributeError: + return True + + +class AnsiToWin32(object): + ''' + Implements a 'write()' method which, on Windows, will strip ANSI character + sequences from the text, and if outputting to a tty, will convert them into + win32 function calls. + ''' + ANSI_CSI_RE = re.compile('\001?\033\\[((?:\\d|;)*)([a-zA-Z])\002?') # Control Sequence Introducer + ANSI_OSC_RE = re.compile('\001?\033\\]((?:.|;)*?)(\x07)\002?') # Operating System Command + + def __init__(self, wrapped, convert=None, strip=None, autoreset=False): + # The wrapped stream (normally sys.stdout or sys.stderr) + self.wrapped = wrapped + + # should we reset colors to defaults after every .write() + self.autoreset = autoreset + + # create the proxy wrapping our output stream + self.stream = StreamWrapper(wrapped, self) + + on_windows = os.name == 'nt' + # We test if the WinAPI works, because even if we are on Windows + # we may be using a terminal that doesn't support the WinAPI + # (e.g. Cygwin Terminal). In this case it's up to the terminal + # to support the ANSI codes. + conversion_supported = on_windows and winapi_test() + + # should we strip ANSI sequences from our output? + if strip is None: + strip = conversion_supported or (not self.stream.closed and not self.stream.isatty()) + self.strip = strip + + # should we should convert ANSI sequences into win32 calls? + if convert is None: + convert = conversion_supported and not self.stream.closed and self.stream.isatty() + self.convert = convert + + # dict of ansi codes to win32 functions and parameters + self.win32_calls = self.get_win32_calls() + + # are we wrapping stderr? + self.on_stderr = self.wrapped is sys.stderr + + def should_wrap(self): + ''' + True if this class is actually needed. If false, then the output + stream will not be affected, nor will win32 calls be issued, so + wrapping stdout is not actually required. This will generally be + False on non-Windows platforms, unless optional functionality like + autoreset has been requested using kwargs to init() + ''' + return self.convert or self.strip or self.autoreset + + def get_win32_calls(self): + if self.convert and winterm: + return { + AnsiStyle.RESET_ALL: (winterm.reset_all, ), + AnsiStyle.BRIGHT: (winterm.style, WinStyle.BRIGHT), + AnsiStyle.DIM: (winterm.style, WinStyle.NORMAL), + AnsiStyle.NORMAL: (winterm.style, WinStyle.NORMAL), + AnsiFore.BLACK: (winterm.fore, WinColor.BLACK), + AnsiFore.RED: (winterm.fore, WinColor.RED), + AnsiFore.GREEN: (winterm.fore, WinColor.GREEN), + AnsiFore.YELLOW: (winterm.fore, WinColor.YELLOW), + AnsiFore.BLUE: (winterm.fore, WinColor.BLUE), + AnsiFore.MAGENTA: (winterm.fore, WinColor.MAGENTA), + AnsiFore.CYAN: (winterm.fore, WinColor.CYAN), + AnsiFore.WHITE: (winterm.fore, WinColor.GREY), + AnsiFore.RESET: (winterm.fore, ), + AnsiFore.LIGHTBLACK_EX: (winterm.fore, WinColor.BLACK, True), + AnsiFore.LIGHTRED_EX: (winterm.fore, WinColor.RED, True), + AnsiFore.LIGHTGREEN_EX: (winterm.fore, WinColor.GREEN, True), + AnsiFore.LIGHTYELLOW_EX: (winterm.fore, WinColor.YELLOW, True), + AnsiFore.LIGHTBLUE_EX: (winterm.fore, WinColor.BLUE, True), + AnsiFore.LIGHTMAGENTA_EX: (winterm.fore, WinColor.MAGENTA, True), + AnsiFore.LIGHTCYAN_EX: (winterm.fore, WinColor.CYAN, True), + AnsiFore.LIGHTWHITE_EX: (winterm.fore, WinColor.GREY, True), + AnsiBack.BLACK: (winterm.back, WinColor.BLACK), + AnsiBack.RED: (winterm.back, WinColor.RED), + AnsiBack.GREEN: (winterm.back, WinColor.GREEN), + AnsiBack.YELLOW: (winterm.back, WinColor.YELLOW), + AnsiBack.BLUE: (winterm.back, WinColor.BLUE), + AnsiBack.MAGENTA: (winterm.back, WinColor.MAGENTA), + AnsiBack.CYAN: (winterm.back, WinColor.CYAN), + AnsiBack.WHITE: (winterm.back, WinColor.GREY), + AnsiBack.RESET: (winterm.back, ), + AnsiBack.LIGHTBLACK_EX: (winterm.back, WinColor.BLACK, True), + AnsiBack.LIGHTRED_EX: (winterm.back, WinColor.RED, True), + AnsiBack.LIGHTGREEN_EX: (winterm.back, WinColor.GREEN, True), + AnsiBack.LIGHTYELLOW_EX: (winterm.back, WinColor.YELLOW, True), + AnsiBack.LIGHTBLUE_EX: (winterm.back, WinColor.BLUE, True), + AnsiBack.LIGHTMAGENTA_EX: (winterm.back, WinColor.MAGENTA, True), + AnsiBack.LIGHTCYAN_EX: (winterm.back, WinColor.CYAN, True), + AnsiBack.LIGHTWHITE_EX: (winterm.back, WinColor.GREY, True), + } + return dict() + + def write(self, text): + if self.strip or self.convert: + self.write_and_convert(text) + else: + self.wrapped.write(text) + self.wrapped.flush() + if self.autoreset: + self.reset_all() + + + def reset_all(self): + if self.convert: + self.call_win32('m', (0,)) + elif not self.strip and not self.stream.closed: + self.wrapped.write(Style.RESET_ALL) + + + def write_and_convert(self, text): + ''' + Write the given text to our wrapped stream, stripping any ANSI + sequences from the text, and optionally converting them into win32 + calls. + ''' + cursor = 0 + text = self.convert_osc(text) + for match in self.ANSI_CSI_RE.finditer(text): + start, end = match.span() + self.write_plain_text(text, cursor, start) + self.convert_ansi(*match.groups()) + cursor = end + self.write_plain_text(text, cursor, len(text)) + + + def write_plain_text(self, text, start, end): + if start < end: + self.wrapped.write(text[start:end]) + self.wrapped.flush() + + + def convert_ansi(self, paramstring, command): + if self.convert: + params = self.extract_params(command, paramstring) + self.call_win32(command, params) + + + def extract_params(self, command, paramstring): + if command in 'Hf': + params = tuple(int(p) if len(p) != 0 else 1 for p in paramstring.split(';')) + while len(params) < 2: + # defaults: + params = params + (1,) + else: + params = tuple(int(p) for p in paramstring.split(';') if len(p) != 0) + if len(params) == 0: + # defaults: + if command in 'JKm': + params = (0,) + elif command in 'ABCD': + params = (1,) + + return params + + + def call_win32(self, command, params): + if command == 'm': + for param in params: + if param in self.win32_calls: + func_args = self.win32_calls[param] + func = func_args[0] + args = func_args[1:] + kwargs = dict(on_stderr=self.on_stderr) + func(*args, **kwargs) + elif command in 'J': + winterm.erase_screen(params[0], on_stderr=self.on_stderr) + elif command in 'K': + winterm.erase_line(params[0], on_stderr=self.on_stderr) + elif command in 'Hf': # cursor position - absolute + winterm.set_cursor_position(params, on_stderr=self.on_stderr) + elif command in 'ABCD': # cursor position - relative + n = params[0] + # A - up, B - down, C - forward, D - back + x, y = {'A': (0, -n), 'B': (0, n), 'C': (n, 0), 'D': (-n, 0)}[command] + winterm.cursor_adjust(x, y, on_stderr=self.on_stderr) + + + def convert_osc(self, text): + for match in self.ANSI_OSC_RE.finditer(text): + start, end = match.span() + text = text[:start] + text[end:] + paramstring, command = match.groups() + if command in '\x07': # \x07 = BEL + params = paramstring.split(";") + # 0 - change title and icon (we will only change title) + # 1 - change icon (we don't support this) + # 2 - change title + if params[0] in '02': + winterm.set_title(params[1]) + return text diff --git a/cres/venv/lib/python3.8/site-packages/colorama/initialise.py b/cres/venv/lib/python3.8/site-packages/colorama/initialise.py new file mode 100644 index 000000000..430d06687 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/colorama/initialise.py @@ -0,0 +1,80 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +import atexit +import contextlib +import sys + +from .ansitowin32 import AnsiToWin32 + + +orig_stdout = None +orig_stderr = None + +wrapped_stdout = None +wrapped_stderr = None + +atexit_done = False + + +def reset_all(): + if AnsiToWin32 is not None: # Issue #74: objects might become None at exit + AnsiToWin32(orig_stdout).reset_all() + + +def init(autoreset=False, convert=None, strip=None, wrap=True): + + if not wrap and any([autoreset, convert, strip]): + raise ValueError('wrap=False conflicts with any other arg=True') + + global wrapped_stdout, wrapped_stderr + global orig_stdout, orig_stderr + + orig_stdout = sys.stdout + orig_stderr = sys.stderr + + if sys.stdout is None: + wrapped_stdout = None + else: + sys.stdout = wrapped_stdout = \ + wrap_stream(orig_stdout, convert, strip, autoreset, wrap) + if sys.stderr is None: + wrapped_stderr = None + else: + sys.stderr = wrapped_stderr = \ + wrap_stream(orig_stderr, convert, strip, autoreset, wrap) + + global atexit_done + if not atexit_done: + atexit.register(reset_all) + atexit_done = True + + +def deinit(): + if orig_stdout is not None: + sys.stdout = orig_stdout + if orig_stderr is not None: + sys.stderr = orig_stderr + + +@contextlib.contextmanager +def colorama_text(*args, **kwargs): + init(*args, **kwargs) + try: + yield + finally: + deinit() + + +def reinit(): + if wrapped_stdout is not None: + sys.stdout = wrapped_stdout + if wrapped_stderr is not None: + sys.stderr = wrapped_stderr + + +def wrap_stream(stream, convert, strip, autoreset, wrap): + if wrap: + wrapper = AnsiToWin32(stream, + convert=convert, strip=strip, autoreset=autoreset) + if wrapper.should_wrap(): + stream = wrapper.stream + return stream diff --git a/cres/venv/lib/python3.8/site-packages/colorama/win32.py b/cres/venv/lib/python3.8/site-packages/colorama/win32.py new file mode 100644 index 000000000..c2d836033 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/colorama/win32.py @@ -0,0 +1,152 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. + +# from winbase.h +STDOUT = -11 +STDERR = -12 + +try: + import ctypes + from ctypes import LibraryLoader + windll = LibraryLoader(ctypes.WinDLL) + from ctypes import wintypes +except (AttributeError, ImportError): + windll = None + SetConsoleTextAttribute = lambda *_: None + winapi_test = lambda *_: None +else: + from ctypes import byref, Structure, c_char, POINTER + + COORD = wintypes._COORD + + class CONSOLE_SCREEN_BUFFER_INFO(Structure): + """struct in wincon.h.""" + _fields_ = [ + ("dwSize", COORD), + ("dwCursorPosition", COORD), + ("wAttributes", wintypes.WORD), + ("srWindow", wintypes.SMALL_RECT), + ("dwMaximumWindowSize", COORD), + ] + def __str__(self): + return '(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)' % ( + self.dwSize.Y, self.dwSize.X + , self.dwCursorPosition.Y, self.dwCursorPosition.X + , self.wAttributes + , self.srWindow.Top, self.srWindow.Left, self.srWindow.Bottom, self.srWindow.Right + , self.dwMaximumWindowSize.Y, self.dwMaximumWindowSize.X + ) + + _GetStdHandle = windll.kernel32.GetStdHandle + _GetStdHandle.argtypes = [ + wintypes.DWORD, + ] + _GetStdHandle.restype = wintypes.HANDLE + + _GetConsoleScreenBufferInfo = windll.kernel32.GetConsoleScreenBufferInfo + _GetConsoleScreenBufferInfo.argtypes = [ + wintypes.HANDLE, + POINTER(CONSOLE_SCREEN_BUFFER_INFO), + ] + _GetConsoleScreenBufferInfo.restype = wintypes.BOOL + + _SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute + _SetConsoleTextAttribute.argtypes = [ + wintypes.HANDLE, + wintypes.WORD, + ] + _SetConsoleTextAttribute.restype = wintypes.BOOL + + _SetConsoleCursorPosition = windll.kernel32.SetConsoleCursorPosition + _SetConsoleCursorPosition.argtypes = [ + wintypes.HANDLE, + COORD, + ] + _SetConsoleCursorPosition.restype = wintypes.BOOL + + _FillConsoleOutputCharacterA = windll.kernel32.FillConsoleOutputCharacterA + _FillConsoleOutputCharacterA.argtypes = [ + wintypes.HANDLE, + c_char, + wintypes.DWORD, + COORD, + POINTER(wintypes.DWORD), + ] + _FillConsoleOutputCharacterA.restype = wintypes.BOOL + + _FillConsoleOutputAttribute = windll.kernel32.FillConsoleOutputAttribute + _FillConsoleOutputAttribute.argtypes = [ + wintypes.HANDLE, + wintypes.WORD, + wintypes.DWORD, + COORD, + POINTER(wintypes.DWORD), + ] + _FillConsoleOutputAttribute.restype = wintypes.BOOL + + _SetConsoleTitleW = windll.kernel32.SetConsoleTitleW + _SetConsoleTitleW.argtypes = [ + wintypes.LPCWSTR + ] + _SetConsoleTitleW.restype = wintypes.BOOL + + def _winapi_test(handle): + csbi = CONSOLE_SCREEN_BUFFER_INFO() + success = _GetConsoleScreenBufferInfo( + handle, byref(csbi)) + return bool(success) + + def winapi_test(): + return any(_winapi_test(h) for h in + (_GetStdHandle(STDOUT), _GetStdHandle(STDERR))) + + def GetConsoleScreenBufferInfo(stream_id=STDOUT): + handle = _GetStdHandle(stream_id) + csbi = CONSOLE_SCREEN_BUFFER_INFO() + success = _GetConsoleScreenBufferInfo( + handle, byref(csbi)) + return csbi + + def SetConsoleTextAttribute(stream_id, attrs): + handle = _GetStdHandle(stream_id) + return _SetConsoleTextAttribute(handle, attrs) + + def SetConsoleCursorPosition(stream_id, position, adjust=True): + position = COORD(*position) + # If the position is out of range, do nothing. + if position.Y <= 0 or position.X <= 0: + return + # Adjust for Windows' SetConsoleCursorPosition: + # 1. being 0-based, while ANSI is 1-based. + # 2. expecting (x,y), while ANSI uses (y,x). + adjusted_position = COORD(position.Y - 1, position.X - 1) + if adjust: + # Adjust for viewport's scroll position + sr = GetConsoleScreenBufferInfo(STDOUT).srWindow + adjusted_position.Y += sr.Top + adjusted_position.X += sr.Left + # Resume normal processing + handle = _GetStdHandle(stream_id) + return _SetConsoleCursorPosition(handle, adjusted_position) + + def FillConsoleOutputCharacter(stream_id, char, length, start): + handle = _GetStdHandle(stream_id) + char = c_char(char.encode()) + length = wintypes.DWORD(length) + num_written = wintypes.DWORD(0) + # Note that this is hard-coded for ANSI (vs wide) bytes. + success = _FillConsoleOutputCharacterA( + handle, char, length, start, byref(num_written)) + return num_written.value + + def FillConsoleOutputAttribute(stream_id, attr, length, start): + ''' FillConsoleOutputAttribute( hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten )''' + handle = _GetStdHandle(stream_id) + attribute = wintypes.WORD(attr) + length = wintypes.DWORD(length) + num_written = wintypes.DWORD(0) + # Note that this is hard-coded for ANSI (vs wide) bytes. + return _FillConsoleOutputAttribute( + handle, attribute, length, start, byref(num_written)) + + def SetConsoleTitle(title): + return _SetConsoleTitleW(title) diff --git a/cres/venv/lib/python3.8/site-packages/colorama/winterm.py b/cres/venv/lib/python3.8/site-packages/colorama/winterm.py new file mode 100644 index 000000000..0fdb4ec4e --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/colorama/winterm.py @@ -0,0 +1,169 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +from . import win32 + + +# from wincon.h +class WinColor(object): + BLACK = 0 + BLUE = 1 + GREEN = 2 + CYAN = 3 + RED = 4 + MAGENTA = 5 + YELLOW = 6 + GREY = 7 + +# from wincon.h +class WinStyle(object): + NORMAL = 0x00 # dim text, dim background + BRIGHT = 0x08 # bright text, dim background + BRIGHT_BACKGROUND = 0x80 # dim text, bright background + +class WinTerm(object): + + def __init__(self): + self._default = win32.GetConsoleScreenBufferInfo(win32.STDOUT).wAttributes + self.set_attrs(self._default) + self._default_fore = self._fore + self._default_back = self._back + self._default_style = self._style + # In order to emulate LIGHT_EX in windows, we borrow the BRIGHT style. + # So that LIGHT_EX colors and BRIGHT style do not clobber each other, + # we track them separately, since LIGHT_EX is overwritten by Fore/Back + # and BRIGHT is overwritten by Style codes. + self._light = 0 + + def get_attrs(self): + return self._fore + self._back * 16 + (self._style | self._light) + + def set_attrs(self, value): + self._fore = value & 7 + self._back = (value >> 4) & 7 + self._style = value & (WinStyle.BRIGHT | WinStyle.BRIGHT_BACKGROUND) + + def reset_all(self, on_stderr=None): + self.set_attrs(self._default) + self.set_console(attrs=self._default) + self._light = 0 + + def fore(self, fore=None, light=False, on_stderr=False): + if fore is None: + fore = self._default_fore + self._fore = fore + # Emulate LIGHT_EX with BRIGHT Style + if light: + self._light |= WinStyle.BRIGHT + else: + self._light &= ~WinStyle.BRIGHT + self.set_console(on_stderr=on_stderr) + + def back(self, back=None, light=False, on_stderr=False): + if back is None: + back = self._default_back + self._back = back + # Emulate LIGHT_EX with BRIGHT_BACKGROUND Style + if light: + self._light |= WinStyle.BRIGHT_BACKGROUND + else: + self._light &= ~WinStyle.BRIGHT_BACKGROUND + self.set_console(on_stderr=on_stderr) + + def style(self, style=None, on_stderr=False): + if style is None: + style = self._default_style + self._style = style + self.set_console(on_stderr=on_stderr) + + def set_console(self, attrs=None, on_stderr=False): + if attrs is None: + attrs = self.get_attrs() + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + win32.SetConsoleTextAttribute(handle, attrs) + + def get_position(self, handle): + position = win32.GetConsoleScreenBufferInfo(handle).dwCursorPosition + # Because Windows coordinates are 0-based, + # and win32.SetConsoleCursorPosition expects 1-based. + position.X += 1 + position.Y += 1 + return position + + def set_cursor_position(self, position=None, on_stderr=False): + if position is None: + # I'm not currently tracking the position, so there is no default. + # position = self.get_position() + return + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + win32.SetConsoleCursorPosition(handle, position) + + def cursor_adjust(self, x, y, on_stderr=False): + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + position = self.get_position(handle) + adjusted_position = (position.Y + y, position.X + x) + win32.SetConsoleCursorPosition(handle, adjusted_position, adjust=False) + + def erase_screen(self, mode=0, on_stderr=False): + # 0 should clear from the cursor to the end of the screen. + # 1 should clear from the cursor to the beginning of the screen. + # 2 should clear the entire screen, and move cursor to (1,1) + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + csbi = win32.GetConsoleScreenBufferInfo(handle) + # get the number of character cells in the current buffer + cells_in_screen = csbi.dwSize.X * csbi.dwSize.Y + # get number of character cells before current cursor position + cells_before_cursor = csbi.dwSize.X * csbi.dwCursorPosition.Y + csbi.dwCursorPosition.X + if mode == 0: + from_coord = csbi.dwCursorPosition + cells_to_erase = cells_in_screen - cells_before_cursor + elif mode == 1: + from_coord = win32.COORD(0, 0) + cells_to_erase = cells_before_cursor + elif mode == 2: + from_coord = win32.COORD(0, 0) + cells_to_erase = cells_in_screen + else: + # invalid mode + return + # fill the entire screen with blanks + win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) + # now set the buffer's attributes accordingly + win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) + if mode == 2: + # put the cursor where needed + win32.SetConsoleCursorPosition(handle, (1, 1)) + + def erase_line(self, mode=0, on_stderr=False): + # 0 should clear from the cursor to the end of the line. + # 1 should clear from the cursor to the beginning of the line. + # 2 should clear the entire line. + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + csbi = win32.GetConsoleScreenBufferInfo(handle) + if mode == 0: + from_coord = csbi.dwCursorPosition + cells_to_erase = csbi.dwSize.X - csbi.dwCursorPosition.X + elif mode == 1: + from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) + cells_to_erase = csbi.dwCursorPosition.X + elif mode == 2: + from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) + cells_to_erase = csbi.dwSize.X + else: + # invalid mode + return + # fill the entire screen with blanks + win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) + # now set the buffer's attributes accordingly + win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) + + def set_title(self, title): + win32.SetConsoleTitle(title) diff --git a/cres/venv/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/AUTHORS.txt b/cres/venv/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/AUTHORS.txt new file mode 100644 index 000000000..72c87d7d3 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/AUTHORS.txt @@ -0,0 +1,562 @@ +A_Rog +Aakanksha Agrawal <11389424+rasponic@users.noreply.github.com> +Abhinav Sagar <40603139+abhinavsagar@users.noreply.github.com> +ABHYUDAY PRATAP SINGH +abs51295 +AceGentile +Adam Chainz +Adam Tse +Adam Tse +Adam Wentz +admin +Adrien Morison +ahayrapetyan +Ahilya +AinsworthK +Akash Srivastava +Alan Yee +Albert Tugushev +Albert-Guan +albertg +Aleks Bunin +Alethea Flowers +Alex Gaynor +Alex Grönholm +Alex Loosley +Alex Morega +Alex Stachowiak +Alexander Shtyrov +Alexandre Conrad +Alexey Popravka +Alexey Popravka +Alli +Ami Fischman +Ananya Maiti +Anatoly Techtonik +Anders Kaseorg +Andreas Lutro +Andrei Geacar +Andrew Gaul +Andrey Bulgakov +Andrés Delfino <34587441+andresdelfino@users.noreply.github.com> +Andrés Delfino +Andy Freeland +Andy Freeland +Andy Kluger +Ani Hayrapetyan +Aniruddha Basak +Anish Tambe +Anrs Hu +Anthony Sottile +Antoine Musso +Anton Ovchinnikov +Anton Patrushev +Antonio Alvarado Hernandez +Antony Lee +Antti Kaihola +Anubhav Patel +Anuj Godase +AQNOUCH Mohammed +AraHaan +Arindam Choudhury +Armin Ronacher +Artem +Ashley Manton +Ashwin Ramaswami +atse +Atsushi Odagiri +Avner Cohen +Baptiste Mispelon +Barney Gale +barneygale +Bartek Ogryczak +Bastian Venthur +Ben Darnell +Ben Hoyt +Ben Rosser +Bence Nagy +Benjamin Peterson +Benjamin VanEvery +Benoit Pierre +Berker Peksag +Bernardo B. Marques +Bernhard M. Wiedemann +Bertil Hatt +Bogdan Opanchuk +BorisZZZ +Brad Erickson +Bradley Ayers +Brandon L. Reiss +Brandt Bucher +Brett Randall +Brian Cristante <33549821+brcrista@users.noreply.github.com> +Brian Cristante +Brian Rosner +BrownTruck +Bruno Oliveira +Bruno Renié +Bstrdsmkr +Buck Golemon +burrows +Bussonnier Matthias +c22 +Caleb Martinez +Calvin Smith +Carl Meyer +Carlos Liam +Carol Willing +Carter Thayer +Cass +Chandrasekhar Atina +Chih-Hsuan Yen +Chih-Hsuan Yen +Chris Brinker +Chris Hunt +Chris Jerdonek +Chris McDonough +Chris Wolfe +Christian Heimes +Christian Oudard +Christopher Hunt +Christopher Snyder +Clark Boylan +Clay McClure +Cody +Cody Soyland +Colin Watson +Connor Osborn +Cooper Lees +Cooper Ry Lees +Cory Benfield +Cory Wright +Craig Kerstiens +Cristian Sorinel +Curtis Doty +cytolentino +Damian Quiroga +Dan Black +Dan Savilonis +Dan Sully +daniel +Daniel Collins +Daniel Hahler +Daniel Holth +Daniel Jost +Daniel Shaulov +Daniele Esposti +Daniele Procida +Danny Hermes +Dav Clark +Dave Abrahams +Dave Jones +David Aguilar +David Black +David Bordeynik +David Bordeynik +David Caro +David Evans +David Linke +David Pursehouse +David Tucker +David Wales +Davidovich +derwolfe +Desetude +Diego Caraballo +DiegoCaraballo +Dmitry Gladkov +Domen Kožar +Donald Stufft +Dongweiming +Douglas Thor +DrFeathers +Dustin Ingram +Dwayne Bailey +Ed Morley <501702+edmorley@users.noreply.github.com> +Ed Morley +Eitan Adler +ekristina +elainechan +Eli Schwartz +Eli Schwartz +Emil Burzo +Emil Styrke +Endoh Takanao +enoch +Erdinc Mutlu +Eric Gillingham +Eric Hanchrow +Eric Hopper +Erik M. Bray +Erik Rose +Ernest W Durbin III +Ernest W. Durbin III +Erwin Janssen +Eugene Vereshchagin +everdimension +Felix Yan +fiber-space +Filip Kokosiński +Florian Briand +Florian Rathgeber +Francesco +Francesco Montesano +Frost Ming +Gabriel Curio +Gabriel de Perthuis +Garry Polley +gdanielson +Geoffrey Lehée +Geoffrey Sneddon +George Song +Georgi Valkov +Giftlin Rajaiah +gizmoguy1 +gkdoc <40815324+gkdoc@users.noreply.github.com> +Gopinath M <31352222+mgopi1990@users.noreply.github.com> +GOTO Hayato <3532528+gh640@users.noreply.github.com> +gpiks +Guilherme Espada +Guy Rozendorn +gzpan123 +Hanjun Kim +Hari Charan +Harsh Vardhan +Herbert Pfennig +Hsiaoming Yang +Hugo +Hugo Lopes Tavares +Hugo van Kemenade +hugovk +Hynek Schlawack +Ian Bicking +Ian Cordasco +Ian Lee +Ian Stapleton Cordasco +Ian Wienand +Ian Wienand +Igor Kuzmitshov +Igor Sobreira +Ilya Baryshev +INADA Naoki +Ionel Cristian Mărieș +Ionel Maries Cristian +Ivan Pozdeev +Jacob Kim +jakirkham +Jakub Stasiak +Jakub Vysoky +Jakub Wilk +James Cleveland +James Cleveland +James Firth +James Polley +Jan Pokorný +Jannis Leidel +jarondl +Jason R. Coombs +Jay Graves +Jean-Christophe Fillion-Robin +Jeff Barber +Jeff Dairiki +Jelmer Vernooij +jenix21 +Jeremy Stanley +Jeremy Zafran +Jiashuo Li +Jim Garrison +Jivan Amara +John Paton +John-Scott Atlakson +johnthagen +johnthagen +Jon Banafato +Jon Dufresne +Jon Parise +Jonas Nockert +Jonathan Herbert +Joost Molenaar +Jorge Niedbalski +Joseph Long +Josh Bronson +Josh Hansen +Josh Schneier +Juanjo Bazán +Julian Berman +Julian Gethmann +Julien Demoor +jwg4 +Jyrki Pulliainen +Kai Chen +Kamal Bin Mustafa +kaustav haldar +keanemind +Keith Maxwell +Kelsey Hightower +Kenneth Belitzky +Kenneth Reitz +Kenneth Reitz +Kevin Burke +Kevin Carter +Kevin Frommelt +Kevin R Patterson +Kexuan Sun +Kit Randel +kpinc +Krishna Oza +Kumar McMillan +Kyle Persohn +lakshmanaram +Laszlo Kiss-Kollar +Laurent Bristiel +Laurie Opperman +Leon Sasson +Lev Givon +Lincoln de Sousa +Lipis +Loren Carvalho +Lucas Cimon +Ludovic Gasc +Luke Macken +Luo Jiebin +luojiebin +luz.paz +László Kiss Kollár +László Kiss Kollár +Marc Abramowitz +Marc Tamlyn +Marcus Smith +Mariatta +Mark Kohler +Mark Williams +Mark Williams +Markus Hametner +Masaki +Masklinn +Matej Stuchlik +Mathew Jennings +Mathieu Bridon +Matt Good +Matt Maker +Matt Robenolt +matthew +Matthew Einhorn +Matthew Gilliard +Matthew Iversen +Matthew Trumbell +Matthew Willson +Matthias Bussonnier +mattip +Maxim Kurnikov +Maxime Rouyrre +mayeut +mbaluna <44498973+mbaluna@users.noreply.github.com> +mdebi <17590103+mdebi@users.noreply.github.com> +memoselyk +Michael +Michael Aquilina +Michael E. Karpeles +Michael Klich +Michael Williamson +michaelpacer +Mickaël Schoentgen +Miguel Araujo Perez +Mihir Singh +Mike +Mike Hendricks +Min RK +MinRK +Miro Hrončok +Monica Baluna +montefra +Monty Taylor +Nate Coraor +Nathaniel J. Smith +Nehal J Wani +Neil Botelho +Nick Coghlan +Nick Stenning +Nick Timkovich +Nicolas Bock +Nikhil Benesch +Nitesh Sharma +Nowell Strite +NtaleGrey +nvdv +Ofekmeister +ofrinevo +Oliver Jeeves +Oliver Tonnhofer +Olivier Girardot +Olivier Grisel +Ollie Rutherfurd +OMOTO Kenji +Omry Yadan +Oren Held +Oscar Benjamin +Oz N Tiram +Pachwenko <32424503+Pachwenko@users.noreply.github.com> +Patrick Dubroy +Patrick Jenkins +Patrick Lawson +patricktokeeffe +Patrik Kopkan +Paul Kehrer +Paul Moore +Paul Nasrat +Paul Oswald +Paul van der Linden +Paulus Schoutsen +Pavithra Eswaramoorthy <33131404+QueenCoffee@users.noreply.github.com> +Pawel Jasinski +Pekka Klärck +Peter Lisák +Peter Waller +petr-tik +Phaneendra Chiruvella +Phil Freo +Phil Pennock +Phil Whelan +Philip Jägenstedt +Philip Molloy +Philippe Ombredanne +Pi Delport +Pierre-Yves Rofes +pip +Prabakaran Kumaresshan +Prabhjyotsing Surjit Singh Sodhi +Prabhu Marappan +Pradyun Gedam +Pratik Mallya +Preet Thakkar +Preston Holmes +Przemek Wrzos +Pulkit Goyal <7895pulkit@gmail.com> +Qiangning Hong +Quentin Pradet +R. David Murray +Rafael Caricio +Ralf Schmitt +Razzi Abuissa +rdb +Remi Rampin +Remi Rampin +Rene Dudfield +Riccardo Magliocchetti +Richard Jones +RobberPhex +Robert Collins +Robert McGibbon +Robert T. McGibbon +robin elisha robinson +Roey Berman +Rohan Jain +Rohan Jain +Rohan Jain +Roman Bogorodskiy +Romuald Brunet +Ronny Pfannschmidt +Rory McCann +Ross Brattain +Roy Wellington Ⅳ +Roy Wellington Ⅳ +Ryan Wooden +ryneeverett +Sachi King +Salvatore Rinchiera +Savio Jomton +schlamar +Scott Kitterman +Sean +seanj +Sebastian Jordan +Sebastian Schaetz +Segev Finer +SeongSoo Cho +Sergey Vasilyev +Seth Woodworth +Shlomi Fish +Shovan Maity +Simeon Visser +Simon Cross +Simon Pichugin +sinoroc +Sorin Sbarnea +Stavros Korokithakis +Stefan Scherfke +Stephan Erb +stepshal +Steve (Gadget) Barnes +Steve Barnes +Steve Dower +Steve Kowalik +Steven Myint +stonebig +Stéphane Bidoul (ACSONE) +Stéphane Bidoul +Stéphane Klein +Sumana Harihareswara +Sviatoslav Sydorenko +Sviatoslav Sydorenko +Swat009 +Takayuki SHIMIZUKAWA +tbeswick +Thijs Triemstra +Thomas Fenzl +Thomas Grainger +Thomas Guettler +Thomas Johansson +Thomas Kluyver +Thomas Smith +Tim D. Smith +Tim Gates +Tim Harder +Tim Heap +tim smith +tinruufu +Tom Forbes +Tom Freudenheim +Tom V +Tomas Orsava +Tomer Chachamu +Tony Beswick +Tony Zhaocheng Tan +TonyBeswick +toonarmycaptain +Toshio Kuratomi +Travis Swicegood +Tzu-ping Chung +Valentin Haenel +Victor Stinner +victorvpaulo +Viktor Szépe +Ville Skyttä +Vinay Sajip +Vincent Philippon +Vinicyus Macedo <7549205+vinicyusmacedo@users.noreply.github.com> +Vitaly Babiy +Vladimir Rutsky +W. Trevor King +Wil Tan +Wilfred Hughes +William ML Leslie +William T Olson +Wilson Mo +wim glenn +Wolfgang Maier +Xavier Fernandez +Xavier Fernandez +xoviat +xtreak +YAMAMOTO Takashi +Yen Chi Hsuan +Yeray Diaz Diaz +Yoval P +Yu Jian +Yuan Jing Vincent Yan +Zearin +Zearin +Zhiping Deng +Zvezdan Petkovic +Łukasz Langa +Семён Марьясин diff --git a/cres/venv/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/INSTALLER b/cres/venv/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/INSTALLER new file mode 100644 index 000000000..a1b589e38 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/cres/venv/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/LICENSE.txt b/cres/venv/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/LICENSE.txt new file mode 100644 index 000000000..737fec5c5 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/LICENSE.txt @@ -0,0 +1,20 @@ +Copyright (c) 2008-2019 The pip developers (see AUTHORS.txt file) + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/cres/venv/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/METADATA b/cres/venv/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/METADATA new file mode 100644 index 000000000..f4d89c410 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/METADATA @@ -0,0 +1,70 @@ +Metadata-Version: 2.1 +Name: contextlib2 +Version: 0.6.0 +Summary: Backports and enhancements for the contextlib module +Home-page: http://contextlib2.readthedocs.org +Author: Nick Coghlan +Author-email: ncoghlan@gmail.com +License: PSF License +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: License :: OSI Approved :: Python Software Foundation License +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* + +.. image:: https://jazzband.co/static/img/badge.svg + :target: https://jazzband.co/ + :alt: Jazzband + +.. image:: https://readthedocs.org/projects/contextlib2/badge/?version=latest + :target: https://contextlib2.readthedocs.org/ + :alt: Latest Docs + +.. image:: https://img.shields.io/travis/jazzband/contextlib2/master.svg + :target: http://travis-ci.org/jazzband/contextlib2 + +.. image:: https://coveralls.io/repos/github/jazzband/contextlib2/badge.svg?branch=master + :target: https://coveralls.io/github/jazzband/contextlib2?branch=master + +.. image:: https://landscape.io/github/jazzband/contextlib2/master/landscape.svg + :target: https://landscape.io/github/jazzband/contextlib2/ + +contextlib2 is a backport of the `standard library's contextlib +module `_ to +earlier Python versions. + +It also serves as a real world proving ground for possible future +enhancements to the standard library version. + +Development +----------- + +contextlib2 has no runtime dependencies, but requires ``unittest2`` for testing +on Python 2.x, as well as ``setuptools`` and ``wheel`` to generate universal +wheel archives. + +Local testing is just a matter of running ``python test_contextlib2.py``. + +You can test against multiple versions of Python with +`tox `_:: + + pip install tox + tox + +Versions currently tested in both tox and Travis CI are: + +* CPython 2.7 +* CPython 3.4 +* CPython 3.5 +* CPython 3.6 +* CPython 3.7 +* PyPy +* PyPy3 + + diff --git a/cres/venv/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/RECORD b/cres/venv/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/RECORD new file mode 100644 index 000000000..e8e6e6631 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/RECORD @@ -0,0 +1,11 @@ +contextlib2.py,sha256=5HjGflUzwWAUfcILhSmC2GqvoYdZZzFzVfIDztHigUs,16915 +contextlib2-0.6.0.dist-info/AUTHORS.txt,sha256=RtqU9KfonVGhI48DAA4-yTOBUhBtQTjFhaDzHoyh7uU,21518 +contextlib2-0.6.0.dist-info/LICENSE.txt,sha256=W6Ifuwlk-TatfRU2LR7W1JMcyMj5_y1NkRkOEJvnRDE,1090 +contextlib2-0.6.0.dist-info/METADATA,sha256=gSVIyF9xprVGAJdZdrVoZR9VXpXRWURqyrugGzj66Rk,2291 +contextlib2-0.6.0.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110 +contextlib2-0.6.0.dist-info/top_level.txt,sha256=RxWWBMkHA_rsw1laXJ8L3yE_fyYaBmvt2bVUvj3WbMg,12 +contextlib2-0.6.0.dist-info/RECORD,, +contextlib2-0.6.0.virtualenv,, +contextlib2-0.6.0.dist-info/__pycache__,, +contextlib2.cpython-38.pyc,, +contextlib2-0.6.0.dist-info/INSTALLER,, \ No newline at end of file diff --git a/cres/venv/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/WHEEL b/cres/venv/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/WHEEL new file mode 100644 index 000000000..ef99c6cf3 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.34.2) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/cres/venv/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/top_level.txt b/cres/venv/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/top_level.txt new file mode 100644 index 000000000..03fdf8ed2 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/contextlib2-0.6.0.dist-info/top_level.txt @@ -0,0 +1 @@ +contextlib2 diff --git a/cres/venv/lib/python3.8/site-packages/contextlib2-0.6.0.virtualenv b/cres/venv/lib/python3.8/site-packages/contextlib2-0.6.0.virtualenv new file mode 100644 index 000000000..e69de29bb diff --git a/cres/venv/lib/python3.8/site-packages/contextlib2.py b/cres/venv/lib/python3.8/site-packages/contextlib2.py new file mode 100644 index 000000000..3aae8f411 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/contextlib2.py @@ -0,0 +1,518 @@ +"""contextlib2 - backports and enhancements to the contextlib module""" + +import abc +import sys +import warnings +from collections import deque +from functools import wraps + +__all__ = ["contextmanager", "closing", "nullcontext", + "AbstractContextManager", + "ContextDecorator", "ExitStack", + "redirect_stdout", "redirect_stderr", "suppress"] + +# Backwards compatibility +__all__ += ["ContextStack"] + + +# Backport abc.ABC +if sys.version_info[:2] >= (3, 4): + _abc_ABC = abc.ABC +else: + _abc_ABC = abc.ABCMeta('ABC', (object,), {'__slots__': ()}) + + +# Backport classic class MRO +def _classic_mro(C, result): + if C in result: + return + result.append(C) + for B in C.__bases__: + _classic_mro(B, result) + return result + + +# Backport _collections_abc._check_methods +def _check_methods(C, *methods): + try: + mro = C.__mro__ + except AttributeError: + mro = tuple(_classic_mro(C, [])) + + for method in methods: + for B in mro: + if method in B.__dict__: + if B.__dict__[method] is None: + return NotImplemented + break + else: + return NotImplemented + return True + + +class AbstractContextManager(_abc_ABC): + """An abstract base class for context managers.""" + + def __enter__(self): + """Return `self` upon entering the runtime context.""" + return self + + @abc.abstractmethod + def __exit__(self, exc_type, exc_value, traceback): + """Raise any exception triggered within the runtime context.""" + return None + + @classmethod + def __subclasshook__(cls, C): + """Check whether subclass is considered a subclass of this ABC.""" + if cls is AbstractContextManager: + return _check_methods(C, "__enter__", "__exit__") + return NotImplemented + + +class ContextDecorator(object): + """A base class or mixin that enables context managers to work as decorators.""" + + def refresh_cm(self): + """Returns the context manager used to actually wrap the call to the + decorated function. + + The default implementation just returns *self*. + + Overriding this method allows otherwise one-shot context managers + like _GeneratorContextManager to support use as decorators via + implicit recreation. + + DEPRECATED: refresh_cm was never added to the standard library's + ContextDecorator API + """ + warnings.warn("refresh_cm was never added to the standard library", + DeprecationWarning) + return self._recreate_cm() + + def _recreate_cm(self): + """Return a recreated instance of self. + + Allows an otherwise one-shot context manager like + _GeneratorContextManager to support use as + a decorator via implicit recreation. + + This is a private interface just for _GeneratorContextManager. + See issue #11647 for details. + """ + return self + + def __call__(self, func): + @wraps(func) + def inner(*args, **kwds): + with self._recreate_cm(): + return func(*args, **kwds) + return inner + + +class _GeneratorContextManager(ContextDecorator): + """Helper for @contextmanager decorator.""" + + def __init__(self, func, args, kwds): + self.gen = func(*args, **kwds) + self.func, self.args, self.kwds = func, args, kwds + # Issue 19330: ensure context manager instances have good docstrings + doc = getattr(func, "__doc__", None) + if doc is None: + doc = type(self).__doc__ + self.__doc__ = doc + # Unfortunately, this still doesn't provide good help output when + # inspecting the created context manager instances, since pydoc + # currently bypasses the instance docstring and shows the docstring + # for the class instead. + # See http://bugs.python.org/issue19404 for more details. + + def _recreate_cm(self): + # _GCM instances are one-shot context managers, so the + # CM must be recreated each time a decorated function is + # called + return self.__class__(self.func, self.args, self.kwds) + + def __enter__(self): + try: + return next(self.gen) + except StopIteration: + raise RuntimeError("generator didn't yield") + + def __exit__(self, type, value, traceback): + if type is None: + try: + next(self.gen) + except StopIteration: + return + else: + raise RuntimeError("generator didn't stop") + else: + if value is None: + # Need to force instantiation so we can reliably + # tell if we get the same exception back + value = type() + try: + self.gen.throw(type, value, traceback) + raise RuntimeError("generator didn't stop after throw()") + except StopIteration as exc: + # Suppress StopIteration *unless* it's the same exception that + # was passed to throw(). This prevents a StopIteration + # raised inside the "with" statement from being suppressed. + return exc is not value + except RuntimeError as exc: + # Don't re-raise the passed in exception + if exc is value: + return False + # Likewise, avoid suppressing if a StopIteration exception + # was passed to throw() and later wrapped into a RuntimeError + # (see PEP 479). + if _HAVE_EXCEPTION_CHAINING and exc.__cause__ is value: + return False + raise + except: + # only re-raise if it's *not* the exception that was + # passed to throw(), because __exit__() must not raise + # an exception unless __exit__() itself failed. But throw() + # has to raise the exception to signal propagation, so this + # fixes the impedance mismatch between the throw() protocol + # and the __exit__() protocol. + # + if sys.exc_info()[1] is not value: + raise + + +def contextmanager(func): + """@contextmanager decorator. + + Typical usage: + + @contextmanager + def some_generator(): + + try: + yield + finally: + + + This makes this: + + with some_generator() as : + + + equivalent to this: + + + try: + = + + finally: + + + """ + @wraps(func) + def helper(*args, **kwds): + return _GeneratorContextManager(func, args, kwds) + return helper + + +class closing(object): + """Context to automatically close something at the end of a block. + + Code like this: + + with closing(.open()) as f: + + + is equivalent to this: + + f = .open() + try: + + finally: + f.close() + + """ + def __init__(self, thing): + self.thing = thing + + def __enter__(self): + return self.thing + + def __exit__(self, *exc_info): + self.thing.close() + + +class _RedirectStream(object): + + _stream = None + + def __init__(self, new_target): + self._new_target = new_target + # We use a list of old targets to make this CM re-entrant + self._old_targets = [] + + def __enter__(self): + self._old_targets.append(getattr(sys, self._stream)) + setattr(sys, self._stream, self._new_target) + return self._new_target + + def __exit__(self, exctype, excinst, exctb): + setattr(sys, self._stream, self._old_targets.pop()) + + +class redirect_stdout(_RedirectStream): + """Context manager for temporarily redirecting stdout to another file. + + # How to send help() to stderr + with redirect_stdout(sys.stderr): + help(dir) + + # How to write help() to a file + with open('help.txt', 'w') as f: + with redirect_stdout(f): + help(pow) + """ + + _stream = "stdout" + + +class redirect_stderr(_RedirectStream): + """Context manager for temporarily redirecting stderr to another file.""" + + _stream = "stderr" + + +class suppress(object): + """Context manager to suppress specified exceptions + + After the exception is suppressed, execution proceeds with the next + statement following the with statement. + + with suppress(FileNotFoundError): + os.remove(somefile) + # Execution still resumes here if the file was already removed + """ + + def __init__(self, *exceptions): + self._exceptions = exceptions + + def __enter__(self): + pass + + def __exit__(self, exctype, excinst, exctb): + # Unlike isinstance and issubclass, CPython exception handling + # currently only looks at the concrete type hierarchy (ignoring + # the instance and subclass checking hooks). While Guido considers + # that a bug rather than a feature, it's a fairly hard one to fix + # due to various internal implementation details. suppress provides + # the simpler issubclass based semantics, rather than trying to + # exactly reproduce the limitations of the CPython interpreter. + # + # See http://bugs.python.org/issue12029 for more details + return exctype is not None and issubclass(exctype, self._exceptions) + + +# Context manipulation is Python 3 only +_HAVE_EXCEPTION_CHAINING = sys.version_info[0] >= 3 +if _HAVE_EXCEPTION_CHAINING: + def _make_context_fixer(frame_exc): + def _fix_exception_context(new_exc, old_exc): + # Context may not be correct, so find the end of the chain + while 1: + exc_context = new_exc.__context__ + if exc_context is old_exc: + # Context is already set correctly (see issue 20317) + return + if exc_context is None or exc_context is frame_exc: + break + new_exc = exc_context + # Change the end of the chain to point to the exception + # we expect it to reference + new_exc.__context__ = old_exc + return _fix_exception_context + + def _reraise_with_existing_context(exc_details): + try: + # bare "raise exc_details[1]" replaces our carefully + # set-up context + fixed_ctx = exc_details[1].__context__ + raise exc_details[1] + except BaseException: + exc_details[1].__context__ = fixed_ctx + raise +else: + # No exception context in Python 2 + def _make_context_fixer(frame_exc): + return lambda new_exc, old_exc: None + + # Use 3 argument raise in Python 2, + # but use exec to avoid SyntaxError in Python 3 + def _reraise_with_existing_context(exc_details): + exc_type, exc_value, exc_tb = exc_details + exec("raise exc_type, exc_value, exc_tb") + +# Handle old-style classes if they exist +try: + from types import InstanceType +except ImportError: + # Python 3 doesn't have old-style classes + _get_type = type +else: + # Need to handle old-style context managers on Python 2 + def _get_type(obj): + obj_type = type(obj) + if obj_type is InstanceType: + return obj.__class__ # Old-style class + return obj_type # New-style class + + +# Inspired by discussions on http://bugs.python.org/issue13585 +class ExitStack(object): + """Context manager for dynamic management of a stack of exit callbacks + + For example: + + with ExitStack() as stack: + files = [stack.enter_context(open(fname)) for fname in filenames] + # All opened files will automatically be closed at the end of + # the with statement, even if attempts to open files later + # in the list raise an exception + + """ + def __init__(self): + self._exit_callbacks = deque() + + def pop_all(self): + """Preserve the context stack by transferring it to a new instance""" + new_stack = type(self)() + new_stack._exit_callbacks = self._exit_callbacks + self._exit_callbacks = deque() + return new_stack + + def _push_cm_exit(self, cm, cm_exit): + """Helper to correctly register callbacks to __exit__ methods""" + def _exit_wrapper(*exc_details): + return cm_exit(cm, *exc_details) + _exit_wrapper.__self__ = cm + self.push(_exit_wrapper) + + def push(self, exit): + """Registers a callback with the standard __exit__ method signature + + Can suppress exceptions the same way __exit__ methods can. + + Also accepts any object with an __exit__ method (registering a call + to the method instead of the object itself) + """ + # We use an unbound method rather than a bound method to follow + # the standard lookup behaviour for special methods + _cb_type = _get_type(exit) + try: + exit_method = _cb_type.__exit__ + except AttributeError: + # Not a context manager, so assume its a callable + self._exit_callbacks.append(exit) + else: + self._push_cm_exit(exit, exit_method) + return exit # Allow use as a decorator + + def callback(self, callback, *args, **kwds): + """Registers an arbitrary callback and arguments. + + Cannot suppress exceptions. + """ + def _exit_wrapper(exc_type, exc, tb): + callback(*args, **kwds) + # We changed the signature, so using @wraps is not appropriate, but + # setting __wrapped__ may still help with introspection + _exit_wrapper.__wrapped__ = callback + self.push(_exit_wrapper) + return callback # Allow use as a decorator + + def enter_context(self, cm): + """Enters the supplied context manager + + If successful, also pushes its __exit__ method as a callback and + returns the result of the __enter__ method. + """ + # We look up the special methods on the type to match the with statement + _cm_type = _get_type(cm) + _exit = _cm_type.__exit__ + result = _cm_type.__enter__(cm) + self._push_cm_exit(cm, _exit) + return result + + def close(self): + """Immediately unwind the context stack""" + self.__exit__(None, None, None) + + def __enter__(self): + return self + + def __exit__(self, *exc_details): + received_exc = exc_details[0] is not None + + # We manipulate the exception state so it behaves as though + # we were actually nesting multiple with statements + frame_exc = sys.exc_info()[1] + _fix_exception_context = _make_context_fixer(frame_exc) + + # Callbacks are invoked in LIFO order to match the behaviour of + # nested context managers + suppressed_exc = False + pending_raise = False + while self._exit_callbacks: + cb = self._exit_callbacks.pop() + try: + if cb(*exc_details): + suppressed_exc = True + pending_raise = False + exc_details = (None, None, None) + except: + new_exc_details = sys.exc_info() + # simulate the stack of exceptions by setting the context + _fix_exception_context(new_exc_details[1], exc_details[1]) + pending_raise = True + exc_details = new_exc_details + if pending_raise: + _reraise_with_existing_context(exc_details) + return received_exc and suppressed_exc + + +# Preserve backwards compatibility +class ContextStack(ExitStack): + """Backwards compatibility alias for ExitStack""" + + def __init__(self): + warnings.warn("ContextStack has been renamed to ExitStack", + DeprecationWarning) + super(ContextStack, self).__init__() + + def register_exit(self, callback): + return self.push(callback) + + def register(self, callback, *args, **kwds): + return self.callback(callback, *args, **kwds) + + def preserve(self): + return self.pop_all() + + +class nullcontext(AbstractContextManager): + """Context manager that does no additional processing. + Used as a stand-in for a normal context manager, when a particular + block of code is only sometimes used with a normal context manager: + cm = optional_cm if condition else nullcontext() + with cm: + # Perform operation, using optional_cm if condition is True + """ + + def __init__(self, enter_result=None): + self.enter_result = enter_result + + def __enter__(self): + return self.enter_result + + def __exit__(self, *excinfo): + pass diff --git a/cres/venv/lib/python3.8/site-packages/distlib-0.3.0.dist-info/AUTHORS.txt b/cres/venv/lib/python3.8/site-packages/distlib-0.3.0.dist-info/AUTHORS.txt new file mode 100644 index 000000000..72c87d7d3 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/distlib-0.3.0.dist-info/AUTHORS.txt @@ -0,0 +1,562 @@ +A_Rog +Aakanksha Agrawal <11389424+rasponic@users.noreply.github.com> +Abhinav Sagar <40603139+abhinavsagar@users.noreply.github.com> +ABHYUDAY PRATAP SINGH +abs51295 +AceGentile +Adam Chainz +Adam Tse +Adam Tse +Adam Wentz +admin +Adrien Morison +ahayrapetyan +Ahilya +AinsworthK +Akash Srivastava +Alan Yee +Albert Tugushev +Albert-Guan +albertg +Aleks Bunin +Alethea Flowers +Alex Gaynor +Alex Grönholm +Alex Loosley +Alex Morega +Alex Stachowiak +Alexander Shtyrov +Alexandre Conrad +Alexey Popravka +Alexey Popravka +Alli +Ami Fischman +Ananya Maiti +Anatoly Techtonik +Anders Kaseorg +Andreas Lutro +Andrei Geacar +Andrew Gaul +Andrey Bulgakov +Andrés Delfino <34587441+andresdelfino@users.noreply.github.com> +Andrés Delfino +Andy Freeland +Andy Freeland +Andy Kluger +Ani Hayrapetyan +Aniruddha Basak +Anish Tambe +Anrs Hu +Anthony Sottile +Antoine Musso +Anton Ovchinnikov +Anton Patrushev +Antonio Alvarado Hernandez +Antony Lee +Antti Kaihola +Anubhav Patel +Anuj Godase +AQNOUCH Mohammed +AraHaan +Arindam Choudhury +Armin Ronacher +Artem +Ashley Manton +Ashwin Ramaswami +atse +Atsushi Odagiri +Avner Cohen +Baptiste Mispelon +Barney Gale +barneygale +Bartek Ogryczak +Bastian Venthur +Ben Darnell +Ben Hoyt +Ben Rosser +Bence Nagy +Benjamin Peterson +Benjamin VanEvery +Benoit Pierre +Berker Peksag +Bernardo B. Marques +Bernhard M. Wiedemann +Bertil Hatt +Bogdan Opanchuk +BorisZZZ +Brad Erickson +Bradley Ayers +Brandon L. Reiss +Brandt Bucher +Brett Randall +Brian Cristante <33549821+brcrista@users.noreply.github.com> +Brian Cristante +Brian Rosner +BrownTruck +Bruno Oliveira +Bruno Renié +Bstrdsmkr +Buck Golemon +burrows +Bussonnier Matthias +c22 +Caleb Martinez +Calvin Smith +Carl Meyer +Carlos Liam +Carol Willing +Carter Thayer +Cass +Chandrasekhar Atina +Chih-Hsuan Yen +Chih-Hsuan Yen +Chris Brinker +Chris Hunt +Chris Jerdonek +Chris McDonough +Chris Wolfe +Christian Heimes +Christian Oudard +Christopher Hunt +Christopher Snyder +Clark Boylan +Clay McClure +Cody +Cody Soyland +Colin Watson +Connor Osborn +Cooper Lees +Cooper Ry Lees +Cory Benfield +Cory Wright +Craig Kerstiens +Cristian Sorinel +Curtis Doty +cytolentino +Damian Quiroga +Dan Black +Dan Savilonis +Dan Sully +daniel +Daniel Collins +Daniel Hahler +Daniel Holth +Daniel Jost +Daniel Shaulov +Daniele Esposti +Daniele Procida +Danny Hermes +Dav Clark +Dave Abrahams +Dave Jones +David Aguilar +David Black +David Bordeynik +David Bordeynik +David Caro +David Evans +David Linke +David Pursehouse +David Tucker +David Wales +Davidovich +derwolfe +Desetude +Diego Caraballo +DiegoCaraballo +Dmitry Gladkov +Domen Kožar +Donald Stufft +Dongweiming +Douglas Thor +DrFeathers +Dustin Ingram +Dwayne Bailey +Ed Morley <501702+edmorley@users.noreply.github.com> +Ed Morley +Eitan Adler +ekristina +elainechan +Eli Schwartz +Eli Schwartz +Emil Burzo +Emil Styrke +Endoh Takanao +enoch +Erdinc Mutlu +Eric Gillingham +Eric Hanchrow +Eric Hopper +Erik M. Bray +Erik Rose +Ernest W Durbin III +Ernest W. Durbin III +Erwin Janssen +Eugene Vereshchagin +everdimension +Felix Yan +fiber-space +Filip Kokosiński +Florian Briand +Florian Rathgeber +Francesco +Francesco Montesano +Frost Ming +Gabriel Curio +Gabriel de Perthuis +Garry Polley +gdanielson +Geoffrey Lehée +Geoffrey Sneddon +George Song +Georgi Valkov +Giftlin Rajaiah +gizmoguy1 +gkdoc <40815324+gkdoc@users.noreply.github.com> +Gopinath M <31352222+mgopi1990@users.noreply.github.com> +GOTO Hayato <3532528+gh640@users.noreply.github.com> +gpiks +Guilherme Espada +Guy Rozendorn +gzpan123 +Hanjun Kim +Hari Charan +Harsh Vardhan +Herbert Pfennig +Hsiaoming Yang +Hugo +Hugo Lopes Tavares +Hugo van Kemenade +hugovk +Hynek Schlawack +Ian Bicking +Ian Cordasco +Ian Lee +Ian Stapleton Cordasco +Ian Wienand +Ian Wienand +Igor Kuzmitshov +Igor Sobreira +Ilya Baryshev +INADA Naoki +Ionel Cristian Mărieș +Ionel Maries Cristian +Ivan Pozdeev +Jacob Kim +jakirkham +Jakub Stasiak +Jakub Vysoky +Jakub Wilk +James Cleveland +James Cleveland +James Firth +James Polley +Jan Pokorný +Jannis Leidel +jarondl +Jason R. Coombs +Jay Graves +Jean-Christophe Fillion-Robin +Jeff Barber +Jeff Dairiki +Jelmer Vernooij +jenix21 +Jeremy Stanley +Jeremy Zafran +Jiashuo Li +Jim Garrison +Jivan Amara +John Paton +John-Scott Atlakson +johnthagen +johnthagen +Jon Banafato +Jon Dufresne +Jon Parise +Jonas Nockert +Jonathan Herbert +Joost Molenaar +Jorge Niedbalski +Joseph Long +Josh Bronson +Josh Hansen +Josh Schneier +Juanjo Bazán +Julian Berman +Julian Gethmann +Julien Demoor +jwg4 +Jyrki Pulliainen +Kai Chen +Kamal Bin Mustafa +kaustav haldar +keanemind +Keith Maxwell +Kelsey Hightower +Kenneth Belitzky +Kenneth Reitz +Kenneth Reitz +Kevin Burke +Kevin Carter +Kevin Frommelt +Kevin R Patterson +Kexuan Sun +Kit Randel +kpinc +Krishna Oza +Kumar McMillan +Kyle Persohn +lakshmanaram +Laszlo Kiss-Kollar +Laurent Bristiel +Laurie Opperman +Leon Sasson +Lev Givon +Lincoln de Sousa +Lipis +Loren Carvalho +Lucas Cimon +Ludovic Gasc +Luke Macken +Luo Jiebin +luojiebin +luz.paz +László Kiss Kollár +László Kiss Kollár +Marc Abramowitz +Marc Tamlyn +Marcus Smith +Mariatta +Mark Kohler +Mark Williams +Mark Williams +Markus Hametner +Masaki +Masklinn +Matej Stuchlik +Mathew Jennings +Mathieu Bridon +Matt Good +Matt Maker +Matt Robenolt +matthew +Matthew Einhorn +Matthew Gilliard +Matthew Iversen +Matthew Trumbell +Matthew Willson +Matthias Bussonnier +mattip +Maxim Kurnikov +Maxime Rouyrre +mayeut +mbaluna <44498973+mbaluna@users.noreply.github.com> +mdebi <17590103+mdebi@users.noreply.github.com> +memoselyk +Michael +Michael Aquilina +Michael E. Karpeles +Michael Klich +Michael Williamson +michaelpacer +Mickaël Schoentgen +Miguel Araujo Perez +Mihir Singh +Mike +Mike Hendricks +Min RK +MinRK +Miro Hrončok +Monica Baluna +montefra +Monty Taylor +Nate Coraor +Nathaniel J. Smith +Nehal J Wani +Neil Botelho +Nick Coghlan +Nick Stenning +Nick Timkovich +Nicolas Bock +Nikhil Benesch +Nitesh Sharma +Nowell Strite +NtaleGrey +nvdv +Ofekmeister +ofrinevo +Oliver Jeeves +Oliver Tonnhofer +Olivier Girardot +Olivier Grisel +Ollie Rutherfurd +OMOTO Kenji +Omry Yadan +Oren Held +Oscar Benjamin +Oz N Tiram +Pachwenko <32424503+Pachwenko@users.noreply.github.com> +Patrick Dubroy +Patrick Jenkins +Patrick Lawson +patricktokeeffe +Patrik Kopkan +Paul Kehrer +Paul Moore +Paul Nasrat +Paul Oswald +Paul van der Linden +Paulus Schoutsen +Pavithra Eswaramoorthy <33131404+QueenCoffee@users.noreply.github.com> +Pawel Jasinski +Pekka Klärck +Peter Lisák +Peter Waller +petr-tik +Phaneendra Chiruvella +Phil Freo +Phil Pennock +Phil Whelan +Philip Jägenstedt +Philip Molloy +Philippe Ombredanne +Pi Delport +Pierre-Yves Rofes +pip +Prabakaran Kumaresshan +Prabhjyotsing Surjit Singh Sodhi +Prabhu Marappan +Pradyun Gedam +Pratik Mallya +Preet Thakkar +Preston Holmes +Przemek Wrzos +Pulkit Goyal <7895pulkit@gmail.com> +Qiangning Hong +Quentin Pradet +R. David Murray +Rafael Caricio +Ralf Schmitt +Razzi Abuissa +rdb +Remi Rampin +Remi Rampin +Rene Dudfield +Riccardo Magliocchetti +Richard Jones +RobberPhex +Robert Collins +Robert McGibbon +Robert T. McGibbon +robin elisha robinson +Roey Berman +Rohan Jain +Rohan Jain +Rohan Jain +Roman Bogorodskiy +Romuald Brunet +Ronny Pfannschmidt +Rory McCann +Ross Brattain +Roy Wellington Ⅳ +Roy Wellington Ⅳ +Ryan Wooden +ryneeverett +Sachi King +Salvatore Rinchiera +Savio Jomton +schlamar +Scott Kitterman +Sean +seanj +Sebastian Jordan +Sebastian Schaetz +Segev Finer +SeongSoo Cho +Sergey Vasilyev +Seth Woodworth +Shlomi Fish +Shovan Maity +Simeon Visser +Simon Cross +Simon Pichugin +sinoroc +Sorin Sbarnea +Stavros Korokithakis +Stefan Scherfke +Stephan Erb +stepshal +Steve (Gadget) Barnes +Steve Barnes +Steve Dower +Steve Kowalik +Steven Myint +stonebig +Stéphane Bidoul (ACSONE) +Stéphane Bidoul +Stéphane Klein +Sumana Harihareswara +Sviatoslav Sydorenko +Sviatoslav Sydorenko +Swat009 +Takayuki SHIMIZUKAWA +tbeswick +Thijs Triemstra +Thomas Fenzl +Thomas Grainger +Thomas Guettler +Thomas Johansson +Thomas Kluyver +Thomas Smith +Tim D. Smith +Tim Gates +Tim Harder +Tim Heap +tim smith +tinruufu +Tom Forbes +Tom Freudenheim +Tom V +Tomas Orsava +Tomer Chachamu +Tony Beswick +Tony Zhaocheng Tan +TonyBeswick +toonarmycaptain +Toshio Kuratomi +Travis Swicegood +Tzu-ping Chung +Valentin Haenel +Victor Stinner +victorvpaulo +Viktor Szépe +Ville Skyttä +Vinay Sajip +Vincent Philippon +Vinicyus Macedo <7549205+vinicyusmacedo@users.noreply.github.com> +Vitaly Babiy +Vladimir Rutsky +W. Trevor King +Wil Tan +Wilfred Hughes +William ML Leslie +William T Olson +Wilson Mo +wim glenn +Wolfgang Maier +Xavier Fernandez +Xavier Fernandez +xoviat +xtreak +YAMAMOTO Takashi +Yen Chi Hsuan +Yeray Diaz Diaz +Yoval P +Yu Jian +Yuan Jing Vincent Yan +Zearin +Zearin +Zhiping Deng +Zvezdan Petkovic +Łukasz Langa +Семён Марьясин diff --git a/cres/venv/lib/python3.8/site-packages/distlib-0.3.0.dist-info/INSTALLER b/cres/venv/lib/python3.8/site-packages/distlib-0.3.0.dist-info/INSTALLER new file mode 100644 index 000000000..a1b589e38 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/distlib-0.3.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/cres/venv/lib/python3.8/site-packages/distlib-0.3.0.dist-info/LICENSE.txt b/cres/venv/lib/python3.8/site-packages/distlib-0.3.0.dist-info/LICENSE.txt new file mode 100644 index 000000000..737fec5c5 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/distlib-0.3.0.dist-info/LICENSE.txt @@ -0,0 +1,20 @@ +Copyright (c) 2008-2019 The pip developers (see AUTHORS.txt file) + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/cres/venv/lib/python3.8/site-packages/distlib-0.3.0.dist-info/METADATA b/cres/venv/lib/python3.8/site-packages/distlib-0.3.0.dist-info/METADATA new file mode 100644 index 000000000..7905cc971 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/distlib-0.3.0.dist-info/METADATA @@ -0,0 +1,31 @@ +Metadata-Version: 2.1 +Name: distlib +Version: 0.3.0 +Summary: Distribution utilities +Home-page: https://bitbucket.org/pypa/distlib +Author: Vinay Sajip +Author-email: vinay_sajip@red-dove.com +License: Python license +Download-URL: https://bitbucket.org/pypa/distlib/downloads/distlib-0.3.0.zip +Platform: any +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Console +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: Python Software Foundation License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3.2 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Topic :: Software Development + +Low-level components of distutils2/packaging, augmented with higher-level APIs for making packaging easier. + + diff --git a/cres/venv/lib/python3.8/site-packages/distlib-0.3.0.dist-info/RECORD b/cres/venv/lib/python3.8/site-packages/distlib-0.3.0.dist-info/RECORD new file mode 100644 index 000000000..a2eb3d0a9 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/distlib-0.3.0.dist-info/RECORD @@ -0,0 +1,48 @@ +distlib/__init__.py,sha256=gzl1hjUXmDGrqRyU7ZLjBwJGAcMimQbrZ22XPVaKaRE,581 +distlib/compat.py,sha256=xdNZmqFN5HwF30HjRn5M415pcC2kgXRBXn767xS8v-M,41404 +distlib/database.py,sha256=fhNzEDtb4HXrpxKyQvhVzDXcOiJlzrOM--UYnvCeZrI,51045 +distlib/index.py,sha256=SXKzpQCERctxYDMp_OLee2f0J0e19ZhGdCIoMlUfUQM,21066 +distlib/locators.py,sha256=c9E4cDEacJ_uKbuE5BqAVocoWp6rsuBGTkiNDQq3zV4,52100 +distlib/manifest.py,sha256=nQEhYmgoreaBZzyFzwYsXxJARu3fo4EkunU163U16iE,14811 +distlib/markers.py,sha256=6Ac3cCfFBERexiESWIOXmg-apIP8l2esafNSX3KMy-8,4387 +distlib/metadata.py,sha256=OhbCKmf5lswE8unWBopI1hj7tRpHp4ZbFvU4d6aAEMM,40234 +distlib/resources.py,sha256=2FGv0ZHF14KXjLIlL0R991lyQQGcewOS4mJ-5n-JVnc,10766 +distlib/scripts.py,sha256=OAkEwxRvIzX-VSfhEttQEKJFVLA47gbW0OgQXJRs7OQ,16998 +distlib/util.py,sha256=f2jZCPrcLCt6LcnC0gUy-Fur60tXD8reA7k4rDpHMDw,59845 +distlib/version.py,sha256=_n7F6juvQGAcn769E_SHa7fOcf5ERlEVymJ_EjPRwGw,23391 +distlib/wheel.py,sha256=bRtR5bNR_u_DwkwktN1bgZuwLVOJT1p_vNIUPyN8kJc,40452 +distlib/_backport/__init__.py,sha256=bqS_dTOH6uW9iGgd0uzfpPjo6vZ4xpPZ7kyfZJ2vNaw,274 +distlib/_backport/misc.py,sha256=KWecINdbFNOxSOP1fGF680CJnaC6S4fBRgEtaYTw0ig,971 +distlib/_backport/shutil.py,sha256=VW1t3uYqUjWZH7jV-6QiimLhnldoV5uIpH4EuiT1jfw,25647 +distlib/_backport/sysconfig.cfg,sha256=swZKxq9RY5e9r3PXCrlvQPMsvOdiWZBTHLEbqS8LJLU,2617 +distlib/_backport/sysconfig.py,sha256=BQHFlb6pubCl_dvT1NjtzIthylofjKisox239stDg0U,26854 +distlib/_backport/tarfile.py,sha256=Ihp7rXRcjbIKw8COm9wSePV9ARGXbSF9gGXAMn2Q-KU,92628 +distlib-0.3.0.dist-info/AUTHORS.txt,sha256=RtqU9KfonVGhI48DAA4-yTOBUhBtQTjFhaDzHoyh7uU,21518 +distlib-0.3.0.dist-info/LICENSE.txt,sha256=W6Ifuwlk-TatfRU2LR7W1JMcyMj5_y1NkRkOEJvnRDE,1090 +distlib-0.3.0.dist-info/METADATA,sha256=K-1KbKXfYWPNkxh639g8H_epsxZqI8SOWXsMxZfD3j4,1251 +distlib-0.3.0.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110 +distlib-0.3.0.dist-info/top_level.txt,sha256=9BERqitu_vzyeyILOcGzX9YyA2AB_xlC4-81V6xoizk,8 +distlib-0.3.0.dist-info/RECORD,, +distlib/locators.cpython-38.pyc,, +distlib/compat.cpython-38.pyc,, +distlib/index.cpython-38.pyc,, +distlib/_backport/misc.cpython-38.pyc,, +distlib/wheel.cpython-38.pyc,, +distlib/_backport/tarfile.cpython-38.pyc,, +distlib/manifest.cpython-38.pyc,, +distlib/database.cpython-38.pyc,, +distlib-0.3.0.virtualenv,, +distlib/scripts.cpython-38.pyc,, +distlib-0.3.0.dist-info/__pycache__,, +distlib/__pycache__,, +distlib/_backport/sysconfig.cpython-38.pyc,, +distlib/__init__.cpython-38.pyc,, +distlib/_backport/__pycache__,, +distlib-0.3.0.dist-info/INSTALLER,, +distlib/version.cpython-38.pyc,, +distlib/_backport/__init__.cpython-38.pyc,, +distlib/_backport/shutil.cpython-38.pyc,, +distlib/metadata.cpython-38.pyc,, +distlib/markers.cpython-38.pyc,, +distlib/resources.cpython-38.pyc,, +distlib/util.cpython-38.pyc,, \ No newline at end of file diff --git a/cres/venv/lib/python3.8/site-packages/distlib-0.3.0.dist-info/WHEEL b/cres/venv/lib/python3.8/site-packages/distlib-0.3.0.dist-info/WHEEL new file mode 100644 index 000000000..ef99c6cf3 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/distlib-0.3.0.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.34.2) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/cres/venv/lib/python3.8/site-packages/distlib-0.3.0.dist-info/top_level.txt b/cres/venv/lib/python3.8/site-packages/distlib-0.3.0.dist-info/top_level.txt new file mode 100644 index 000000000..f68bb0727 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/distlib-0.3.0.dist-info/top_level.txt @@ -0,0 +1 @@ +distlib diff --git a/cres/venv/lib/python3.8/site-packages/distlib-0.3.0.virtualenv b/cres/venv/lib/python3.8/site-packages/distlib-0.3.0.virtualenv new file mode 100644 index 000000000..e69de29bb diff --git a/cres/venv/lib/python3.8/site-packages/distlib/__init__.py b/cres/venv/lib/python3.8/site-packages/distlib/__init__.py new file mode 100644 index 000000000..e19aebdc4 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/distlib/__init__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2019 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +import logging + +__version__ = '0.3.0' + +class DistlibException(Exception): + pass + +try: + from logging import NullHandler +except ImportError: # pragma: no cover + class NullHandler(logging.Handler): + def handle(self, record): pass + def emit(self, record): pass + def createLock(self): self.lock = None + +logger = logging.getLogger(__name__) +logger.addHandler(NullHandler()) diff --git a/cres/venv/lib/python3.8/site-packages/distlib/__pycache__/__init__.cpython-38.pyc b/cres/venv/lib/python3.8/site-packages/distlib/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..07ae7cc127cf29c67f4532cbd67fce2505c0ac9a GIT binary patch literal 1071 zcmah|OHUL*5U!s0&H}Dzj6cAb>|u9ExNtCrM2VV^jgc624t9p=W*K&NX6YV4h&T8l zaOCFi>6`K7*_$V;dU$Nm#GZ7eYU}Y;e^vW_aWMuw-&VhW-f#eZkTHKEG}iIz3WWf{ zN=QLCDSHLN72X*LPdcY=>Ynt_>z6R~Qjft0sGfQt{Yk9eF`y6Q0}*0;C}A(a4DS(L9h>Nw z-pfKaWwE{SC6}|NsH;)mH4*1kHkF*4nDc2Z4ocD&INv|W%GPrUD!^)1{N7J?>#0n3 z>Uuj<$y-(L$-L3Y(b3Uh)*6GNYUEgDgfP%eR*6gro#aaD zx@hEJmgSRdi~*u;G2y(ZiiY#y>{#Ilpi6HeC1Td@Gt(U%l;vwIUrO~C4-~piIZsgB z@*tcuNZocwsV969pzVv0h*dP!oD#1O=|t!YyxKz{U<)qU$TD&17*ES`#{^2|wGy`+ zsSra=uxndeM*SCFI9ZTLdalEIY>7SgWA+CQ C3FLVI literal 0 HcmV?d00001 diff --git a/cres/venv/lib/python3.8/site-packages/distlib/__pycache__/compat.cpython-38.pyc b/cres/venv/lib/python3.8/site-packages/distlib/__pycache__/compat.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d659486e94f3bb88942a6a31ed69d2ecb0cde51f GIT binary patch literal 32220 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 Nj67N@jcgnl`oChG^X~uv literal 0 HcmV?d00001 diff --git a/cres/venv/lib/python3.8/site-packages/distlib/__pycache__/resources.cpython-38.pyc b/cres/venv/lib/python3.8/site-packages/distlib/__pycache__/resources.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..718993d339f2486a80dacbc3fa0251b8315e91e2 GIT binary patch literal 11021 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 Yi7goX!=G#9^|J^G=Z?WScXFlw1MpcCVgLXD literal 0 HcmV?d00001 diff --git a/cres/venv/lib/python3.8/site-packages/distlib/__pycache__/util.cpython-38.pyc b/cres/venv/lib/python3.8/site-packages/distlib/__pycache__/util.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..70db2b50aaba5d839ca30ba403e5d8b197a2b6d2 GIT binary patch literal 48174 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 literal 0 HcmV?d00001 diff --git a/cres/venv/lib/python3.8/site-packages/distlib/_backport/__init__.py b/cres/venv/lib/python3.8/site-packages/distlib/_backport/__init__.py new file mode 100644 index 000000000..f7dbf4c9a --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/distlib/_backport/__init__.py @@ -0,0 +1,6 @@ +"""Modules copied from Python 3 standard libraries, for internal use only. + +Individual classes and functions are found in d2._backport.misc. Intended +usage is to always import things missing from 3.1 from that module: the +built-in/stdlib objects will be used if found. +""" diff --git a/cres/venv/lib/python3.8/site-packages/distlib/_backport/misc.py b/cres/venv/lib/python3.8/site-packages/distlib/_backport/misc.py new file mode 100644 index 000000000..cfb318d34 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/distlib/_backport/misc.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Backports for individual classes and functions.""" + +import os +import sys + +__all__ = ['cache_from_source', 'callable', 'fsencode'] + + +try: + from imp import cache_from_source +except ImportError: + def cache_from_source(py_file, debug=__debug__): + ext = debug and 'c' or 'o' + return py_file + ext + + +try: + callable = callable +except NameError: + from collections import Callable + + def callable(obj): + return isinstance(obj, Callable) + + +try: + fsencode = os.fsencode +except AttributeError: + def fsencode(filename): + if isinstance(filename, bytes): + return filename + elif isinstance(filename, str): + return filename.encode(sys.getfilesystemencoding()) + else: + raise TypeError("expect bytes or str, not %s" % + type(filename).__name__) diff --git a/cres/venv/lib/python3.8/site-packages/distlib/_backport/shutil.py b/cres/venv/lib/python3.8/site-packages/distlib/_backport/shutil.py new file mode 100644 index 000000000..159e49ee8 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/distlib/_backport/shutil.py @@ -0,0 +1,761 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Utility functions for copying and archiving files and directory trees. + +XXX The functions here don't copy the resource fork or other metadata on Mac. + +""" + +import os +import sys +import stat +from os.path import abspath +import fnmatch +import collections +import errno +from . import tarfile + +try: + import bz2 + _BZ2_SUPPORTED = True +except ImportError: + _BZ2_SUPPORTED = False + +try: + from pwd import getpwnam +except ImportError: + getpwnam = None + +try: + from grp import getgrnam +except ImportError: + getgrnam = None + +__all__ = ["copyfileobj", "copyfile", "copymode", "copystat", "copy", "copy2", + "copytree", "move", "rmtree", "Error", "SpecialFileError", + "ExecError", "make_archive", "get_archive_formats", + "register_archive_format", "unregister_archive_format", + "get_unpack_formats", "register_unpack_format", + "unregister_unpack_format", "unpack_archive", "ignore_patterns"] + +class Error(EnvironmentError): + pass + +class SpecialFileError(EnvironmentError): + """Raised when trying to do a kind of operation (e.g. copying) which is + not supported on a special file (e.g. a named pipe)""" + +class ExecError(EnvironmentError): + """Raised when a command could not be executed""" + +class ReadError(EnvironmentError): + """Raised when an archive cannot be read""" + +class RegistryError(Exception): + """Raised when a registry operation with the archiving + and unpacking registries fails""" + + +try: + WindowsError +except NameError: + WindowsError = None + +def copyfileobj(fsrc, fdst, length=16*1024): + """copy data from file-like object fsrc to file-like object fdst""" + while 1: + buf = fsrc.read(length) + if not buf: + break + fdst.write(buf) + +def _samefile(src, dst): + # Macintosh, Unix. + if hasattr(os.path, 'samefile'): + try: + return os.path.samefile(src, dst) + except OSError: + return False + + # All other platforms: check for same pathname. + return (os.path.normcase(os.path.abspath(src)) == + os.path.normcase(os.path.abspath(dst))) + +def copyfile(src, dst): + """Copy data from src to dst""" + if _samefile(src, dst): + raise Error("`%s` and `%s` are the same file" % (src, dst)) + + for fn in [src, dst]: + try: + st = os.stat(fn) + except OSError: + # File most likely does not exist + pass + else: + # XXX What about other special files? (sockets, devices...) + if stat.S_ISFIFO(st.st_mode): + raise SpecialFileError("`%s` is a named pipe" % fn) + + with open(src, 'rb') as fsrc: + with open(dst, 'wb') as fdst: + copyfileobj(fsrc, fdst) + +def copymode(src, dst): + """Copy mode bits from src to dst""" + if hasattr(os, 'chmod'): + st = os.stat(src) + mode = stat.S_IMODE(st.st_mode) + os.chmod(dst, mode) + +def copystat(src, dst): + """Copy all stat info (mode bits, atime, mtime, flags) from src to dst""" + st = os.stat(src) + mode = stat.S_IMODE(st.st_mode) + if hasattr(os, 'utime'): + os.utime(dst, (st.st_atime, st.st_mtime)) + if hasattr(os, 'chmod'): + os.chmod(dst, mode) + if hasattr(os, 'chflags') and hasattr(st, 'st_flags'): + try: + os.chflags(dst, st.st_flags) + except OSError as why: + if (not hasattr(errno, 'EOPNOTSUPP') or + why.errno != errno.EOPNOTSUPP): + raise + +def copy(src, dst): + """Copy data and mode bits ("cp src dst"). + + The destination may be a directory. + + """ + if os.path.isdir(dst): + dst = os.path.join(dst, os.path.basename(src)) + copyfile(src, dst) + copymode(src, dst) + +def copy2(src, dst): + """Copy data and all stat info ("cp -p src dst"). + + The destination may be a directory. + + """ + if os.path.isdir(dst): + dst = os.path.join(dst, os.path.basename(src)) + copyfile(src, dst) + copystat(src, dst) + +def ignore_patterns(*patterns): + """Function that can be used as copytree() ignore parameter. + + Patterns is a sequence of glob-style patterns + that are used to exclude files""" + def _ignore_patterns(path, names): + ignored_names = [] + for pattern in patterns: + ignored_names.extend(fnmatch.filter(names, pattern)) + return set(ignored_names) + return _ignore_patterns + +def copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, + ignore_dangling_symlinks=False): + """Recursively copy a directory tree. + + The destination directory must not already exist. + If exception(s) occur, an Error is raised with a list of reasons. + + If the optional symlinks flag is true, symbolic links in the + source tree result in symbolic links in the destination tree; if + it is false, the contents of the files pointed to by symbolic + links are copied. If the file pointed by the symlink doesn't + exist, an exception will be added in the list of errors raised in + an Error exception at the end of the copy process. + + You can set the optional ignore_dangling_symlinks flag to true if you + want to silence this exception. Notice that this has no effect on + platforms that don't support os.symlink. + + The optional ignore argument is a callable. If given, it + is called with the `src` parameter, which is the directory + being visited by copytree(), and `names` which is the list of + `src` contents, as returned by os.listdir(): + + callable(src, names) -> ignored_names + + Since copytree() is called recursively, the callable will be + called once for each directory that is copied. It returns a + list of names relative to the `src` directory that should + not be copied. + + The optional copy_function argument is a callable that will be used + to copy each file. It will be called with the source path and the + destination path as arguments. By default, copy2() is used, but any + function that supports the same signature (like copy()) can be used. + + """ + names = os.listdir(src) + if ignore is not None: + ignored_names = ignore(src, names) + else: + ignored_names = set() + + os.makedirs(dst) + errors = [] + for name in names: + if name in ignored_names: + continue + srcname = os.path.join(src, name) + dstname = os.path.join(dst, name) + try: + if os.path.islink(srcname): + linkto = os.readlink(srcname) + if symlinks: + os.symlink(linkto, dstname) + else: + # ignore dangling symlink if the flag is on + if not os.path.exists(linkto) and ignore_dangling_symlinks: + continue + # otherwise let the copy occurs. copy2 will raise an error + copy_function(srcname, dstname) + elif os.path.isdir(srcname): + copytree(srcname, dstname, symlinks, ignore, copy_function) + else: + # Will raise a SpecialFileError for unsupported file types + copy_function(srcname, dstname) + # catch the Error from the recursive copytree so that we can + # continue with other files + except Error as err: + errors.extend(err.args[0]) + except EnvironmentError as why: + errors.append((srcname, dstname, str(why))) + try: + copystat(src, dst) + except OSError as why: + if WindowsError is not None and isinstance(why, WindowsError): + # Copying file access times may fail on Windows + pass + else: + errors.extend((src, dst, str(why))) + if errors: + raise Error(errors) + +def rmtree(path, ignore_errors=False, onerror=None): + """Recursively delete a directory tree. + + If ignore_errors is set, errors are ignored; otherwise, if onerror + is set, it is called to handle the error with arguments (func, + path, exc_info) where func is os.listdir, os.remove, or os.rmdir; + path is the argument to that function that caused it to fail; and + exc_info is a tuple returned by sys.exc_info(). If ignore_errors + is false and onerror is None, an exception is raised. + + """ + if ignore_errors: + def onerror(*args): + pass + elif onerror is None: + def onerror(*args): + raise + try: + if os.path.islink(path): + # symlinks to directories are forbidden, see bug #1669 + raise OSError("Cannot call rmtree on a symbolic link") + except OSError: + onerror(os.path.islink, path, sys.exc_info()) + # can't continue even if onerror hook returns + return + names = [] + try: + names = os.listdir(path) + except os.error: + onerror(os.listdir, path, sys.exc_info()) + for name in names: + fullname = os.path.join(path, name) + try: + mode = os.lstat(fullname).st_mode + except os.error: + mode = 0 + if stat.S_ISDIR(mode): + rmtree(fullname, ignore_errors, onerror) + else: + try: + os.remove(fullname) + except os.error: + onerror(os.remove, fullname, sys.exc_info()) + try: + os.rmdir(path) + except os.error: + onerror(os.rmdir, path, sys.exc_info()) + + +def _basename(path): + # A basename() variant which first strips the trailing slash, if present. + # Thus we always get the last component of the path, even for directories. + return os.path.basename(path.rstrip(os.path.sep)) + +def move(src, dst): + """Recursively move a file or directory to another location. This is + similar to the Unix "mv" command. + + If the destination is a directory or a symlink to a directory, the source + is moved inside the directory. The destination path must not already + exist. + + If the destination already exists but is not a directory, it may be + overwritten depending on os.rename() semantics. + + If the destination is on our current filesystem, then rename() is used. + Otherwise, src is copied to the destination and then removed. + A lot more could be done here... A look at a mv.c shows a lot of + the issues this implementation glosses over. + + """ + real_dst = dst + if os.path.isdir(dst): + if _samefile(src, dst): + # We might be on a case insensitive filesystem, + # perform the rename anyway. + os.rename(src, dst) + return + + real_dst = os.path.join(dst, _basename(src)) + if os.path.exists(real_dst): + raise Error("Destination path '%s' already exists" % real_dst) + try: + os.rename(src, real_dst) + except OSError: + if os.path.isdir(src): + if _destinsrc(src, dst): + raise Error("Cannot move a directory '%s' into itself '%s'." % (src, dst)) + copytree(src, real_dst, symlinks=True) + rmtree(src) + else: + copy2(src, real_dst) + os.unlink(src) + +def _destinsrc(src, dst): + src = abspath(src) + dst = abspath(dst) + if not src.endswith(os.path.sep): + src += os.path.sep + if not dst.endswith(os.path.sep): + dst += os.path.sep + return dst.startswith(src) + +def _get_gid(name): + """Returns a gid, given a group name.""" + if getgrnam is None or name is None: + return None + try: + result = getgrnam(name) + except KeyError: + result = None + if result is not None: + return result[2] + return None + +def _get_uid(name): + """Returns an uid, given a user name.""" + if getpwnam is None or name is None: + return None + try: + result = getpwnam(name) + except KeyError: + result = None + if result is not None: + return result[2] + return None + +def _make_tarball(base_name, base_dir, compress="gzip", verbose=0, dry_run=0, + owner=None, group=None, logger=None): + """Create a (possibly compressed) tar file from all the files under + 'base_dir'. + + 'compress' must be "gzip" (the default), "bzip2", or None. + + 'owner' and 'group' can be used to define an owner and a group for the + archive that is being built. If not provided, the current owner and group + will be used. + + The output tar file will be named 'base_name' + ".tar", possibly plus + the appropriate compression extension (".gz", or ".bz2"). + + Returns the output filename. + """ + tar_compression = {'gzip': 'gz', None: ''} + compress_ext = {'gzip': '.gz'} + + if _BZ2_SUPPORTED: + tar_compression['bzip2'] = 'bz2' + compress_ext['bzip2'] = '.bz2' + + # flags for compression program, each element of list will be an argument + if compress is not None and compress not in compress_ext: + raise ValueError("bad value for 'compress', or compression format not " + "supported : {0}".format(compress)) + + archive_name = base_name + '.tar' + compress_ext.get(compress, '') + archive_dir = os.path.dirname(archive_name) + + if not os.path.exists(archive_dir): + if logger is not None: + logger.info("creating %s", archive_dir) + if not dry_run: + os.makedirs(archive_dir) + + # creating the tarball + if logger is not None: + logger.info('Creating tar archive') + + uid = _get_uid(owner) + gid = _get_gid(group) + + def _set_uid_gid(tarinfo): + if gid is not None: + tarinfo.gid = gid + tarinfo.gname = group + if uid is not None: + tarinfo.uid = uid + tarinfo.uname = owner + return tarinfo + + if not dry_run: + tar = tarfile.open(archive_name, 'w|%s' % tar_compression[compress]) + try: + tar.add(base_dir, filter=_set_uid_gid) + finally: + tar.close() + + return archive_name + +def _call_external_zip(base_dir, zip_filename, verbose=False, dry_run=False): + # XXX see if we want to keep an external call here + if verbose: + zipoptions = "-r" + else: + zipoptions = "-rq" + from distutils.errors import DistutilsExecError + from distutils.spawn import spawn + try: + spawn(["zip", zipoptions, zip_filename, base_dir], dry_run=dry_run) + except DistutilsExecError: + # XXX really should distinguish between "couldn't find + # external 'zip' command" and "zip failed". + raise ExecError("unable to create zip file '%s': " + "could neither import the 'zipfile' module nor " + "find a standalone zip utility") % zip_filename + +def _make_zipfile(base_name, base_dir, verbose=0, dry_run=0, logger=None): + """Create a zip file from all the files under 'base_dir'. + + The output zip file will be named 'base_name' + ".zip". Uses either the + "zipfile" Python module (if available) or the InfoZIP "zip" utility + (if installed and found on the default search path). If neither tool is + available, raises ExecError. Returns the name of the output zip + file. + """ + zip_filename = base_name + ".zip" + archive_dir = os.path.dirname(base_name) + + if not os.path.exists(archive_dir): + if logger is not None: + logger.info("creating %s", archive_dir) + if not dry_run: + os.makedirs(archive_dir) + + # If zipfile module is not available, try spawning an external 'zip' + # command. + try: + import zipfile + except ImportError: + zipfile = None + + if zipfile is None: + _call_external_zip(base_dir, zip_filename, verbose, dry_run) + else: + if logger is not None: + logger.info("creating '%s' and adding '%s' to it", + zip_filename, base_dir) + + if not dry_run: + zip = zipfile.ZipFile(zip_filename, "w", + compression=zipfile.ZIP_DEFLATED) + + for dirpath, dirnames, filenames in os.walk(base_dir): + for name in filenames: + path = os.path.normpath(os.path.join(dirpath, name)) + if os.path.isfile(path): + zip.write(path, path) + if logger is not None: + logger.info("adding '%s'", path) + zip.close() + + return zip_filename + +_ARCHIVE_FORMATS = { + 'gztar': (_make_tarball, [('compress', 'gzip')], "gzip'ed tar-file"), + 'bztar': (_make_tarball, [('compress', 'bzip2')], "bzip2'ed tar-file"), + 'tar': (_make_tarball, [('compress', None)], "uncompressed tar file"), + 'zip': (_make_zipfile, [], "ZIP file"), + } + +if _BZ2_SUPPORTED: + _ARCHIVE_FORMATS['bztar'] = (_make_tarball, [('compress', 'bzip2')], + "bzip2'ed tar-file") + +def get_archive_formats(): + """Returns a list of supported formats for archiving and unarchiving. + + Each element of the returned sequence is a tuple (name, description) + """ + formats = [(name, registry[2]) for name, registry in + _ARCHIVE_FORMATS.items()] + formats.sort() + return formats + +def register_archive_format(name, function, extra_args=None, description=''): + """Registers an archive format. + + name is the name of the format. function is the callable that will be + used to create archives. If provided, extra_args is a sequence of + (name, value) tuples that will be passed as arguments to the callable. + description can be provided to describe the format, and will be returned + by the get_archive_formats() function. + """ + if extra_args is None: + extra_args = [] + if not isinstance(function, collections.Callable): + raise TypeError('The %s object is not callable' % function) + if not isinstance(extra_args, (tuple, list)): + raise TypeError('extra_args needs to be a sequence') + for element in extra_args: + if not isinstance(element, (tuple, list)) or len(element) !=2: + raise TypeError('extra_args elements are : (arg_name, value)') + + _ARCHIVE_FORMATS[name] = (function, extra_args, description) + +def unregister_archive_format(name): + del _ARCHIVE_FORMATS[name] + +def make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0, + dry_run=0, owner=None, group=None, logger=None): + """Create an archive file (eg. zip or tar). + + 'base_name' is the name of the file to create, minus any format-specific + extension; 'format' is the archive format: one of "zip", "tar", "bztar" + or "gztar". + + 'root_dir' is a directory that will be the root directory of the + archive; ie. we typically chdir into 'root_dir' before creating the + archive. 'base_dir' is the directory where we start archiving from; + ie. 'base_dir' will be the common prefix of all files and + directories in the archive. 'root_dir' and 'base_dir' both default + to the current directory. Returns the name of the archive file. + + 'owner' and 'group' are used when creating a tar archive. By default, + uses the current owner and group. + """ + save_cwd = os.getcwd() + if root_dir is not None: + if logger is not None: + logger.debug("changing into '%s'", root_dir) + base_name = os.path.abspath(base_name) + if not dry_run: + os.chdir(root_dir) + + if base_dir is None: + base_dir = os.curdir + + kwargs = {'dry_run': dry_run, 'logger': logger} + + try: + format_info = _ARCHIVE_FORMATS[format] + except KeyError: + raise ValueError("unknown archive format '%s'" % format) + + func = format_info[0] + for arg, val in format_info[1]: + kwargs[arg] = val + + if format != 'zip': + kwargs['owner'] = owner + kwargs['group'] = group + + try: + filename = func(base_name, base_dir, **kwargs) + finally: + if root_dir is not None: + if logger is not None: + logger.debug("changing back to '%s'", save_cwd) + os.chdir(save_cwd) + + return filename + + +def get_unpack_formats(): + """Returns a list of supported formats for unpacking. + + Each element of the returned sequence is a tuple + (name, extensions, description) + """ + formats = [(name, info[0], info[3]) for name, info in + _UNPACK_FORMATS.items()] + formats.sort() + return formats + +def _check_unpack_options(extensions, function, extra_args): + """Checks what gets registered as an unpacker.""" + # first make sure no other unpacker is registered for this extension + existing_extensions = {} + for name, info in _UNPACK_FORMATS.items(): + for ext in info[0]: + existing_extensions[ext] = name + + for extension in extensions: + if extension in existing_extensions: + msg = '%s is already registered for "%s"' + raise RegistryError(msg % (extension, + existing_extensions[extension])) + + if not isinstance(function, collections.Callable): + raise TypeError('The registered function must be a callable') + + +def register_unpack_format(name, extensions, function, extra_args=None, + description=''): + """Registers an unpack format. + + `name` is the name of the format. `extensions` is a list of extensions + corresponding to the format. + + `function` is the callable that will be + used to unpack archives. The callable will receive archives to unpack. + If it's unable to handle an archive, it needs to raise a ReadError + exception. + + If provided, `extra_args` is a sequence of + (name, value) tuples that will be passed as arguments to the callable. + description can be provided to describe the format, and will be returned + by the get_unpack_formats() function. + """ + if extra_args is None: + extra_args = [] + _check_unpack_options(extensions, function, extra_args) + _UNPACK_FORMATS[name] = extensions, function, extra_args, description + +def unregister_unpack_format(name): + """Removes the pack format from the registry.""" + del _UNPACK_FORMATS[name] + +def _ensure_directory(path): + """Ensure that the parent directory of `path` exists""" + dirname = os.path.dirname(path) + if not os.path.isdir(dirname): + os.makedirs(dirname) + +def _unpack_zipfile(filename, extract_dir): + """Unpack zip `filename` to `extract_dir` + """ + try: + import zipfile + except ImportError: + raise ReadError('zlib not supported, cannot unpack this archive.') + + if not zipfile.is_zipfile(filename): + raise ReadError("%s is not a zip file" % filename) + + zip = zipfile.ZipFile(filename) + try: + for info in zip.infolist(): + name = info.filename + + # don't extract absolute paths or ones with .. in them + if name.startswith('/') or '..' in name: + continue + + target = os.path.join(extract_dir, *name.split('/')) + if not target: + continue + + _ensure_directory(target) + if not name.endswith('/'): + # file + data = zip.read(info.filename) + f = open(target, 'wb') + try: + f.write(data) + finally: + f.close() + del data + finally: + zip.close() + +def _unpack_tarfile(filename, extract_dir): + """Unpack tar/tar.gz/tar.bz2 `filename` to `extract_dir` + """ + try: + tarobj = tarfile.open(filename) + except tarfile.TarError: + raise ReadError( + "%s is not a compressed or uncompressed tar file" % filename) + try: + tarobj.extractall(extract_dir) + finally: + tarobj.close() + +_UNPACK_FORMATS = { + 'gztar': (['.tar.gz', '.tgz'], _unpack_tarfile, [], "gzip'ed tar-file"), + 'tar': (['.tar'], _unpack_tarfile, [], "uncompressed tar file"), + 'zip': (['.zip'], _unpack_zipfile, [], "ZIP file") + } + +if _BZ2_SUPPORTED: + _UNPACK_FORMATS['bztar'] = (['.bz2'], _unpack_tarfile, [], + "bzip2'ed tar-file") + +def _find_unpack_format(filename): + for name, info in _UNPACK_FORMATS.items(): + for extension in info[0]: + if filename.endswith(extension): + return name + return None + +def unpack_archive(filename, extract_dir=None, format=None): + """Unpack an archive. + + `filename` is the name of the archive. + + `extract_dir` is the name of the target directory, where the archive + is unpacked. If not provided, the current working directory is used. + + `format` is the archive format: one of "zip", "tar", or "gztar". Or any + other registered format. If not provided, unpack_archive will use the + filename extension and see if an unpacker was registered for that + extension. + + In case none is found, a ValueError is raised. + """ + if extract_dir is None: + extract_dir = os.getcwd() + + if format is not None: + try: + format_info = _UNPACK_FORMATS[format] + except KeyError: + raise ValueError("Unknown unpack format '{0}'".format(format)) + + func = format_info[1] + func(filename, extract_dir, **dict(format_info[2])) + else: + # we need to look at the registered unpackers supported extensions + format = _find_unpack_format(filename) + if format is None: + raise ReadError("Unknown archive format '{0}'".format(filename)) + + func = _UNPACK_FORMATS[format][1] + kwargs = dict(_UNPACK_FORMATS[format][2]) + func(filename, extract_dir, **kwargs) diff --git a/cres/venv/lib/python3.8/site-packages/distlib/_backport/sysconfig.cfg b/cres/venv/lib/python3.8/site-packages/distlib/_backport/sysconfig.cfg new file mode 100644 index 000000000..1746bd01c --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/distlib/_backport/sysconfig.cfg @@ -0,0 +1,84 @@ +[posix_prefix] +# Configuration directories. Some of these come straight out of the +# configure script. They are for implementing the other variables, not to +# be used directly in [resource_locations]. +confdir = /etc +datadir = /usr/share +libdir = /usr/lib +statedir = /var +# User resource directory +local = ~/.local/{distribution.name} + +stdlib = {base}/lib/python{py_version_short} +platstdlib = {platbase}/lib/python{py_version_short} +purelib = {base}/lib/python{py_version_short}/site-packages +platlib = {platbase}/lib/python{py_version_short}/site-packages +include = {base}/include/python{py_version_short}{abiflags} +platinclude = {platbase}/include/python{py_version_short}{abiflags} +data = {base} + +[posix_home] +stdlib = {base}/lib/python +platstdlib = {base}/lib/python +purelib = {base}/lib/python +platlib = {base}/lib/python +include = {base}/include/python +platinclude = {base}/include/python +scripts = {base}/bin +data = {base} + +[nt] +stdlib = {base}/Lib +platstdlib = {base}/Lib +purelib = {base}/Lib/site-packages +platlib = {base}/Lib/site-packages +include = {base}/Include +platinclude = {base}/Include +scripts = {base}/Scripts +data = {base} + +[os2] +stdlib = {base}/Lib +platstdlib = {base}/Lib +purelib = {base}/Lib/site-packages +platlib = {base}/Lib/site-packages +include = {base}/Include +platinclude = {base}/Include +scripts = {base}/Scripts +data = {base} + +[os2_home] +stdlib = {userbase}/lib/python{py_version_short} +platstdlib = {userbase}/lib/python{py_version_short} +purelib = {userbase}/lib/python{py_version_short}/site-packages +platlib = {userbase}/lib/python{py_version_short}/site-packages +include = {userbase}/include/python{py_version_short} +scripts = {userbase}/bin +data = {userbase} + +[nt_user] +stdlib = {userbase}/Python{py_version_nodot} +platstdlib = {userbase}/Python{py_version_nodot} +purelib = {userbase}/Python{py_version_nodot}/site-packages +platlib = {userbase}/Python{py_version_nodot}/site-packages +include = {userbase}/Python{py_version_nodot}/Include +scripts = {userbase}/Scripts +data = {userbase} + +[posix_user] +stdlib = {userbase}/lib/python{py_version_short} +platstdlib = {userbase}/lib/python{py_version_short} +purelib = {userbase}/lib/python{py_version_short}/site-packages +platlib = {userbase}/lib/python{py_version_short}/site-packages +include = {userbase}/include/python{py_version_short} +scripts = {userbase}/bin +data = {userbase} + +[osx_framework_user] +stdlib = {userbase}/lib/python +platstdlib = {userbase}/lib/python +purelib = {userbase}/lib/python/site-packages +platlib = {userbase}/lib/python/site-packages +include = {userbase}/include +scripts = {userbase}/bin +data = {userbase} diff --git a/cres/venv/lib/python3.8/site-packages/distlib/_backport/sysconfig.py b/cres/venv/lib/python3.8/site-packages/distlib/_backport/sysconfig.py new file mode 100644 index 000000000..b470a373c --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/distlib/_backport/sysconfig.py @@ -0,0 +1,786 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Access to Python's configuration information.""" + +import codecs +import os +import re +import sys +from os.path import pardir, realpath +try: + import configparser +except ImportError: + import ConfigParser as configparser + + +__all__ = [ + 'get_config_h_filename', + 'get_config_var', + 'get_config_vars', + 'get_makefile_filename', + 'get_path', + 'get_path_names', + 'get_paths', + 'get_platform', + 'get_python_version', + 'get_scheme_names', + 'parse_config_h', +] + + +def _safe_realpath(path): + try: + return realpath(path) + except OSError: + return path + + +if sys.executable: + _PROJECT_BASE = os.path.dirname(_safe_realpath(sys.executable)) +else: + # sys.executable can be empty if argv[0] has been changed and Python is + # unable to retrieve the real program name + _PROJECT_BASE = _safe_realpath(os.getcwd()) + +if os.name == "nt" and "pcbuild" in _PROJECT_BASE[-8:].lower(): + _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir)) +# PC/VS7.1 +if os.name == "nt" and "\\pc\\v" in _PROJECT_BASE[-10:].lower(): + _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir, pardir)) +# PC/AMD64 +if os.name == "nt" and "\\pcbuild\\amd64" in _PROJECT_BASE[-14:].lower(): + _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir, pardir)) + + +def is_python_build(): + for fn in ("Setup.dist", "Setup.local"): + if os.path.isfile(os.path.join(_PROJECT_BASE, "Modules", fn)): + return True + return False + +_PYTHON_BUILD = is_python_build() + +_cfg_read = False + +def _ensure_cfg_read(): + global _cfg_read + if not _cfg_read: + from ..resources import finder + backport_package = __name__.rsplit('.', 1)[0] + _finder = finder(backport_package) + _cfgfile = _finder.find('sysconfig.cfg') + assert _cfgfile, 'sysconfig.cfg exists' + with _cfgfile.as_stream() as s: + _SCHEMES.readfp(s) + if _PYTHON_BUILD: + for scheme in ('posix_prefix', 'posix_home'): + _SCHEMES.set(scheme, 'include', '{srcdir}/Include') + _SCHEMES.set(scheme, 'platinclude', '{projectbase}/.') + + _cfg_read = True + + +_SCHEMES = configparser.RawConfigParser() +_VAR_REPL = re.compile(r'\{([^{]*?)\}') + +def _expand_globals(config): + _ensure_cfg_read() + if config.has_section('globals'): + globals = config.items('globals') + else: + globals = tuple() + + sections = config.sections() + for section in sections: + if section == 'globals': + continue + for option, value in globals: + if config.has_option(section, option): + continue + config.set(section, option, value) + config.remove_section('globals') + + # now expanding local variables defined in the cfg file + # + for section in config.sections(): + variables = dict(config.items(section)) + + def _replacer(matchobj): + name = matchobj.group(1) + if name in variables: + return variables[name] + return matchobj.group(0) + + for option, value in config.items(section): + config.set(section, option, _VAR_REPL.sub(_replacer, value)) + +#_expand_globals(_SCHEMES) + +_PY_VERSION = '%s.%s.%s' % sys.version_info[:3] +_PY_VERSION_SHORT = '%s.%s' % sys.version_info[:2] +_PY_VERSION_SHORT_NO_DOT = '%s%s' % sys.version_info[:2] +_PREFIX = os.path.normpath(sys.prefix) +_EXEC_PREFIX = os.path.normpath(sys.exec_prefix) +_CONFIG_VARS = None +_USER_BASE = None + + +def _subst_vars(path, local_vars): + """In the string `path`, replace tokens like {some.thing} with the + corresponding value from the map `local_vars`. + + If there is no corresponding value, leave the token unchanged. + """ + def _replacer(matchobj): + name = matchobj.group(1) + if name in local_vars: + return local_vars[name] + elif name in os.environ: + return os.environ[name] + return matchobj.group(0) + return _VAR_REPL.sub(_replacer, path) + + +def _extend_dict(target_dict, other_dict): + target_keys = target_dict.keys() + for key, value in other_dict.items(): + if key in target_keys: + continue + target_dict[key] = value + + +def _expand_vars(scheme, vars): + res = {} + if vars is None: + vars = {} + _extend_dict(vars, get_config_vars()) + + for key, value in _SCHEMES.items(scheme): + if os.name in ('posix', 'nt'): + value = os.path.expanduser(value) + res[key] = os.path.normpath(_subst_vars(value, vars)) + return res + + +def format_value(value, vars): + def _replacer(matchobj): + name = matchobj.group(1) + if name in vars: + return vars[name] + return matchobj.group(0) + return _VAR_REPL.sub(_replacer, value) + + +def _get_default_scheme(): + if os.name == 'posix': + # the default scheme for posix is posix_prefix + return 'posix_prefix' + return os.name + + +def _getuserbase(): + env_base = os.environ.get("PYTHONUSERBASE", None) + + def joinuser(*args): + return os.path.expanduser(os.path.join(*args)) + + # what about 'os2emx', 'riscos' ? + if os.name == "nt": + base = os.environ.get("APPDATA") or "~" + if env_base: + return env_base + else: + return joinuser(base, "Python") + + if sys.platform == "darwin": + framework = get_config_var("PYTHONFRAMEWORK") + if framework: + if env_base: + return env_base + else: + return joinuser("~", "Library", framework, "%d.%d" % + sys.version_info[:2]) + + if env_base: + return env_base + else: + return joinuser("~", ".local") + + +def _parse_makefile(filename, vars=None): + """Parse a Makefile-style file. + + A dictionary containing name/value pairs is returned. If an + optional dictionary is passed in as the second argument, it is + used instead of a new dictionary. + """ + # Regexes needed for parsing Makefile (and similar syntaxes, + # like old-style Setup files). + _variable_rx = re.compile(r"([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*(.*)") + _findvar1_rx = re.compile(r"\$\(([A-Za-z][A-Za-z0-9_]*)\)") + _findvar2_rx = re.compile(r"\${([A-Za-z][A-Za-z0-9_]*)}") + + if vars is None: + vars = {} + done = {} + notdone = {} + + with codecs.open(filename, encoding='utf-8', errors="surrogateescape") as f: + lines = f.readlines() + + for line in lines: + if line.startswith('#') or line.strip() == '': + continue + m = _variable_rx.match(line) + if m: + n, v = m.group(1, 2) + v = v.strip() + # `$$' is a literal `$' in make + tmpv = v.replace('$$', '') + + if "$" in tmpv: + notdone[n] = v + else: + try: + v = int(v) + except ValueError: + # insert literal `$' + done[n] = v.replace('$$', '$') + else: + done[n] = v + + # do variable interpolation here + variables = list(notdone.keys()) + + # Variables with a 'PY_' prefix in the makefile. These need to + # be made available without that prefix through sysconfig. + # Special care is needed to ensure that variable expansion works, even + # if the expansion uses the name without a prefix. + renamed_variables = ('CFLAGS', 'LDFLAGS', 'CPPFLAGS') + + while len(variables) > 0: + for name in tuple(variables): + value = notdone[name] + m = _findvar1_rx.search(value) or _findvar2_rx.search(value) + if m is not None: + n = m.group(1) + found = True + if n in done: + item = str(done[n]) + elif n in notdone: + # get it on a subsequent round + found = False + elif n in os.environ: + # do it like make: fall back to environment + item = os.environ[n] + + elif n in renamed_variables: + if (name.startswith('PY_') and + name[3:] in renamed_variables): + item = "" + + elif 'PY_' + n in notdone: + found = False + + else: + item = str(done['PY_' + n]) + + else: + done[n] = item = "" + + if found: + after = value[m.end():] + value = value[:m.start()] + item + after + if "$" in after: + notdone[name] = value + else: + try: + value = int(value) + except ValueError: + done[name] = value.strip() + else: + done[name] = value + variables.remove(name) + + if (name.startswith('PY_') and + name[3:] in renamed_variables): + + name = name[3:] + if name not in done: + done[name] = value + + else: + # bogus variable reference (e.g. "prefix=$/opt/python"); + # just drop it since we can't deal + done[name] = value + variables.remove(name) + + # strip spurious spaces + for k, v in done.items(): + if isinstance(v, str): + done[k] = v.strip() + + # save the results in the global dictionary + vars.update(done) + return vars + + +def get_makefile_filename(): + """Return the path of the Makefile.""" + if _PYTHON_BUILD: + return os.path.join(_PROJECT_BASE, "Makefile") + if hasattr(sys, 'abiflags'): + config_dir_name = 'config-%s%s' % (_PY_VERSION_SHORT, sys.abiflags) + else: + config_dir_name = 'config' + return os.path.join(get_path('stdlib'), config_dir_name, 'Makefile') + + +def _init_posix(vars): + """Initialize the module as appropriate for POSIX systems.""" + # load the installed Makefile: + makefile = get_makefile_filename() + try: + _parse_makefile(makefile, vars) + except IOError as e: + msg = "invalid Python installation: unable to open %s" % makefile + if hasattr(e, "strerror"): + msg = msg + " (%s)" % e.strerror + raise IOError(msg) + # load the installed pyconfig.h: + config_h = get_config_h_filename() + try: + with open(config_h) as f: + parse_config_h(f, vars) + except IOError as e: + msg = "invalid Python installation: unable to open %s" % config_h + if hasattr(e, "strerror"): + msg = msg + " (%s)" % e.strerror + raise IOError(msg) + # On AIX, there are wrong paths to the linker scripts in the Makefile + # -- these paths are relative to the Python source, but when installed + # the scripts are in another directory. + if _PYTHON_BUILD: + vars['LDSHARED'] = vars['BLDSHARED'] + + +def _init_non_posix(vars): + """Initialize the module as appropriate for NT""" + # set basic install directories + vars['LIBDEST'] = get_path('stdlib') + vars['BINLIBDEST'] = get_path('platstdlib') + vars['INCLUDEPY'] = get_path('include') + vars['SO'] = '.pyd' + vars['EXE'] = '.exe' + vars['VERSION'] = _PY_VERSION_SHORT_NO_DOT + vars['BINDIR'] = os.path.dirname(_safe_realpath(sys.executable)) + +# +# public APIs +# + + +def parse_config_h(fp, vars=None): + """Parse a config.h-style file. + + A dictionary containing name/value pairs is returned. If an + optional dictionary is passed in as the second argument, it is + used instead of a new dictionary. + """ + if vars is None: + vars = {} + define_rx = re.compile("#define ([A-Z][A-Za-z0-9_]+) (.*)\n") + undef_rx = re.compile("/[*] #undef ([A-Z][A-Za-z0-9_]+) [*]/\n") + + while True: + line = fp.readline() + if not line: + break + m = define_rx.match(line) + if m: + n, v = m.group(1, 2) + try: + v = int(v) + except ValueError: + pass + vars[n] = v + else: + m = undef_rx.match(line) + if m: + vars[m.group(1)] = 0 + return vars + + +def get_config_h_filename(): + """Return the path of pyconfig.h.""" + if _PYTHON_BUILD: + if os.name == "nt": + inc_dir = os.path.join(_PROJECT_BASE, "PC") + else: + inc_dir = _PROJECT_BASE + else: + inc_dir = get_path('platinclude') + return os.path.join(inc_dir, 'pyconfig.h') + + +def get_scheme_names(): + """Return a tuple containing the schemes names.""" + return tuple(sorted(_SCHEMES.sections())) + + +def get_path_names(): + """Return a tuple containing the paths names.""" + # xxx see if we want a static list + return _SCHEMES.options('posix_prefix') + + +def get_paths(scheme=_get_default_scheme(), vars=None, expand=True): + """Return a mapping containing an install scheme. + + ``scheme`` is the install scheme name. If not provided, it will + return the default scheme for the current platform. + """ + _ensure_cfg_read() + if expand: + return _expand_vars(scheme, vars) + else: + return dict(_SCHEMES.items(scheme)) + + +def get_path(name, scheme=_get_default_scheme(), vars=None, expand=True): + """Return a path corresponding to the scheme. + + ``scheme`` is the install scheme name. + """ + return get_paths(scheme, vars, expand)[name] + + +def get_config_vars(*args): + """With no arguments, return a dictionary of all configuration + variables relevant for the current platform. + + On Unix, this means every variable defined in Python's installed Makefile; + On Windows and Mac OS it's a much smaller set. + + With arguments, return a list of values that result from looking up + each argument in the configuration variable dictionary. + """ + global _CONFIG_VARS + if _CONFIG_VARS is None: + _CONFIG_VARS = {} + # Normalized versions of prefix and exec_prefix are handy to have; + # in fact, these are the standard versions used most places in the + # distutils2 module. + _CONFIG_VARS['prefix'] = _PREFIX + _CONFIG_VARS['exec_prefix'] = _EXEC_PREFIX + _CONFIG_VARS['py_version'] = _PY_VERSION + _CONFIG_VARS['py_version_short'] = _PY_VERSION_SHORT + _CONFIG_VARS['py_version_nodot'] = _PY_VERSION[0] + _PY_VERSION[2] + _CONFIG_VARS['base'] = _PREFIX + _CONFIG_VARS['platbase'] = _EXEC_PREFIX + _CONFIG_VARS['projectbase'] = _PROJECT_BASE + try: + _CONFIG_VARS['abiflags'] = sys.abiflags + except AttributeError: + # sys.abiflags may not be defined on all platforms. + _CONFIG_VARS['abiflags'] = '' + + if os.name in ('nt', 'os2'): + _init_non_posix(_CONFIG_VARS) + if os.name == 'posix': + _init_posix(_CONFIG_VARS) + # Setting 'userbase' is done below the call to the + # init function to enable using 'get_config_var' in + # the init-function. + if sys.version >= '2.6': + _CONFIG_VARS['userbase'] = _getuserbase() + + if 'srcdir' not in _CONFIG_VARS: + _CONFIG_VARS['srcdir'] = _PROJECT_BASE + else: + _CONFIG_VARS['srcdir'] = _safe_realpath(_CONFIG_VARS['srcdir']) + + # Convert srcdir into an absolute path if it appears necessary. + # Normally it is relative to the build directory. However, during + # testing, for example, we might be running a non-installed python + # from a different directory. + if _PYTHON_BUILD and os.name == "posix": + base = _PROJECT_BASE + try: + cwd = os.getcwd() + except OSError: + cwd = None + if (not os.path.isabs(_CONFIG_VARS['srcdir']) and + base != cwd): + # srcdir is relative and we are not in the same directory + # as the executable. Assume executable is in the build + # directory and make srcdir absolute. + srcdir = os.path.join(base, _CONFIG_VARS['srcdir']) + _CONFIG_VARS['srcdir'] = os.path.normpath(srcdir) + + if sys.platform == 'darwin': + kernel_version = os.uname()[2] # Kernel version (8.4.3) + major_version = int(kernel_version.split('.')[0]) + + if major_version < 8: + # On Mac OS X before 10.4, check if -arch and -isysroot + # are in CFLAGS or LDFLAGS and remove them if they are. + # This is needed when building extensions on a 10.3 system + # using a universal build of python. + for key in ('LDFLAGS', 'BASECFLAGS', + # a number of derived variables. These need to be + # patched up as well. + 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): + flags = _CONFIG_VARS[key] + flags = re.sub(r'-arch\s+\w+\s', ' ', flags) + flags = re.sub('-isysroot [^ \t]*', ' ', flags) + _CONFIG_VARS[key] = flags + else: + # Allow the user to override the architecture flags using + # an environment variable. + # NOTE: This name was introduced by Apple in OSX 10.5 and + # is used by several scripting languages distributed with + # that OS release. + if 'ARCHFLAGS' in os.environ: + arch = os.environ['ARCHFLAGS'] + for key in ('LDFLAGS', 'BASECFLAGS', + # a number of derived variables. These need to be + # patched up as well. + 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): + + flags = _CONFIG_VARS[key] + flags = re.sub(r'-arch\s+\w+\s', ' ', flags) + flags = flags + ' ' + arch + _CONFIG_VARS[key] = flags + + # If we're on OSX 10.5 or later and the user tries to + # compiles an extension using an SDK that is not present + # on the current machine it is better to not use an SDK + # than to fail. + # + # The major usecase for this is users using a Python.org + # binary installer on OSX 10.6: that installer uses + # the 10.4u SDK, but that SDK is not installed by default + # when you install Xcode. + # + CFLAGS = _CONFIG_VARS.get('CFLAGS', '') + m = re.search(r'-isysroot\s+(\S+)', CFLAGS) + if m is not None: + sdk = m.group(1) + if not os.path.exists(sdk): + for key in ('LDFLAGS', 'BASECFLAGS', + # a number of derived variables. These need to be + # patched up as well. + 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): + + flags = _CONFIG_VARS[key] + flags = re.sub(r'-isysroot\s+\S+(\s|$)', ' ', flags) + _CONFIG_VARS[key] = flags + + if args: + vals = [] + for name in args: + vals.append(_CONFIG_VARS.get(name)) + return vals + else: + return _CONFIG_VARS + + +def get_config_var(name): + """Return the value of a single variable using the dictionary returned by + 'get_config_vars()'. + + Equivalent to get_config_vars().get(name) + """ + return get_config_vars().get(name) + + +def get_platform(): + """Return a string that identifies the current platform. + + This is used mainly to distinguish platform-specific build directories and + platform-specific built distributions. Typically includes the OS name + and version and the architecture (as supplied by 'os.uname()'), + although the exact information included depends on the OS; eg. for IRIX + the architecture isn't particularly important (IRIX only runs on SGI + hardware), but for Linux the kernel version isn't particularly + important. + + Examples of returned values: + linux-i586 + linux-alpha (?) + solaris-2.6-sun4u + irix-5.3 + irix64-6.2 + + Windows will return one of: + win-amd64 (64bit Windows on AMD64 (aka x86_64, Intel64, EM64T, etc) + win-ia64 (64bit Windows on Itanium) + win32 (all others - specifically, sys.platform is returned) + + For other non-POSIX platforms, currently just returns 'sys.platform'. + """ + if os.name == 'nt': + # sniff sys.version for architecture. + prefix = " bit (" + i = sys.version.find(prefix) + if i == -1: + return sys.platform + j = sys.version.find(")", i) + look = sys.version[i+len(prefix):j].lower() + if look == 'amd64': + return 'win-amd64' + if look == 'itanium': + return 'win-ia64' + return sys.platform + + if os.name != "posix" or not hasattr(os, 'uname'): + # XXX what about the architecture? NT is Intel or Alpha, + # Mac OS is M68k or PPC, etc. + return sys.platform + + # Try to distinguish various flavours of Unix + osname, host, release, version, machine = os.uname() + + # Convert the OS name to lowercase, remove '/' characters + # (to accommodate BSD/OS), and translate spaces (for "Power Macintosh") + osname = osname.lower().replace('/', '') + machine = machine.replace(' ', '_') + machine = machine.replace('/', '-') + + if osname[:5] == "linux": + # At least on Linux/Intel, 'machine' is the processor -- + # i386, etc. + # XXX what about Alpha, SPARC, etc? + return "%s-%s" % (osname, machine) + elif osname[:5] == "sunos": + if release[0] >= "5": # SunOS 5 == Solaris 2 + osname = "solaris" + release = "%d.%s" % (int(release[0]) - 3, release[2:]) + # fall through to standard osname-release-machine representation + elif osname[:4] == "irix": # could be "irix64"! + return "%s-%s" % (osname, release) + elif osname[:3] == "aix": + return "%s-%s.%s" % (osname, version, release) + elif osname[:6] == "cygwin": + osname = "cygwin" + rel_re = re.compile(r'[\d.]+') + m = rel_re.match(release) + if m: + release = m.group() + elif osname[:6] == "darwin": + # + # For our purposes, we'll assume that the system version from + # distutils' perspective is what MACOSX_DEPLOYMENT_TARGET is set + # to. This makes the compatibility story a bit more sane because the + # machine is going to compile and link as if it were + # MACOSX_DEPLOYMENT_TARGET. + cfgvars = get_config_vars() + macver = cfgvars.get('MACOSX_DEPLOYMENT_TARGET') + + if True: + # Always calculate the release of the running machine, + # needed to determine if we can build fat binaries or not. + + macrelease = macver + # Get the system version. Reading this plist is a documented + # way to get the system version (see the documentation for + # the Gestalt Manager) + try: + f = open('/System/Library/CoreServices/SystemVersion.plist') + except IOError: + # We're on a plain darwin box, fall back to the default + # behaviour. + pass + else: + try: + m = re.search(r'ProductUserVisibleVersion\s*' + r'(.*?)', f.read()) + finally: + f.close() + if m is not None: + macrelease = '.'.join(m.group(1).split('.')[:2]) + # else: fall back to the default behaviour + + if not macver: + macver = macrelease + + if macver: + release = macver + osname = "macosx" + + if ((macrelease + '.') >= '10.4.' and + '-arch' in get_config_vars().get('CFLAGS', '').strip()): + # The universal build will build fat binaries, but not on + # systems before 10.4 + # + # Try to detect 4-way universal builds, those have machine-type + # 'universal' instead of 'fat'. + + machine = 'fat' + cflags = get_config_vars().get('CFLAGS') + + archs = re.findall(r'-arch\s+(\S+)', cflags) + archs = tuple(sorted(set(archs))) + + if len(archs) == 1: + machine = archs[0] + elif archs == ('i386', 'ppc'): + machine = 'fat' + elif archs == ('i386', 'x86_64'): + machine = 'intel' + elif archs == ('i386', 'ppc', 'x86_64'): + machine = 'fat3' + elif archs == ('ppc64', 'x86_64'): + machine = 'fat64' + elif archs == ('i386', 'ppc', 'ppc64', 'x86_64'): + machine = 'universal' + else: + raise ValueError( + "Don't know machine value for archs=%r" % (archs,)) + + elif machine == 'i386': + # On OSX the machine type returned by uname is always the + # 32-bit variant, even if the executable architecture is + # the 64-bit variant + if sys.maxsize >= 2**32: + machine = 'x86_64' + + elif machine in ('PowerPC', 'Power_Macintosh'): + # Pick a sane name for the PPC architecture. + # See 'i386' case + if sys.maxsize >= 2**32: + machine = 'ppc64' + else: + machine = 'ppc' + + return "%s-%s-%s" % (osname, release, machine) + + +def get_python_version(): + return _PY_VERSION_SHORT + + +def _print_dict(title, data): + for index, (key, value) in enumerate(sorted(data.items())): + if index == 0: + print('%s: ' % (title)) + print('\t%s = "%s"' % (key, value)) + + +def _main(): + """Display all information sysconfig detains.""" + print('Platform: "%s"' % get_platform()) + print('Python version: "%s"' % get_python_version()) + print('Current installation scheme: "%s"' % _get_default_scheme()) + print() + _print_dict('Paths', get_paths()) + print() + _print_dict('Variables', get_config_vars()) + + +if __name__ == '__main__': + _main() diff --git a/cres/venv/lib/python3.8/site-packages/distlib/_backport/tarfile.py b/cres/venv/lib/python3.8/site-packages/distlib/_backport/tarfile.py new file mode 100644 index 000000000..d66d85663 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/distlib/_backport/tarfile.py @@ -0,0 +1,2607 @@ +#------------------------------------------------------------------- +# tarfile.py +#------------------------------------------------------------------- +# Copyright (C) 2002 Lars Gustaebel +# All rights reserved. +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation +# files (the "Software"), to deal in the Software without +# restriction, including without limitation the rights to use, +# copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following +# conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +# OTHER DEALINGS IN THE SOFTWARE. +# +from __future__ import print_function + +"""Read from and write to tar format archives. +""" + +__version__ = "$Revision$" + +version = "0.9.0" +__author__ = "Lars Gust\u00e4bel (lars@gustaebel.de)" +__date__ = "$Date: 2011-02-25 17:42:01 +0200 (Fri, 25 Feb 2011) $" +__cvsid__ = "$Id: tarfile.py 88586 2011-02-25 15:42:01Z marc-andre.lemburg $" +__credits__ = "Gustavo Niemeyer, Niels Gust\u00e4bel, Richard Townsend." + +#--------- +# Imports +#--------- +import sys +import os +import stat +import errno +import time +import struct +import copy +import re + +try: + import grp, pwd +except ImportError: + grp = pwd = None + +# os.symlink on Windows prior to 6.0 raises NotImplementedError +symlink_exception = (AttributeError, NotImplementedError) +try: + # WindowsError (1314) will be raised if the caller does not hold the + # SeCreateSymbolicLinkPrivilege privilege + symlink_exception += (WindowsError,) +except NameError: + pass + +# from tarfile import * +__all__ = ["TarFile", "TarInfo", "is_tarfile", "TarError"] + +if sys.version_info[0] < 3: + import __builtin__ as builtins +else: + import builtins + +_open = builtins.open # Since 'open' is TarFile.open + +#--------------------------------------------------------- +# tar constants +#--------------------------------------------------------- +NUL = b"\0" # the null character +BLOCKSIZE = 512 # length of processing blocks +RECORDSIZE = BLOCKSIZE * 20 # length of records +GNU_MAGIC = b"ustar \0" # magic gnu tar string +POSIX_MAGIC = b"ustar\x0000" # magic posix tar string + +LENGTH_NAME = 100 # maximum length of a filename +LENGTH_LINK = 100 # maximum length of a linkname +LENGTH_PREFIX = 155 # maximum length of the prefix field + +REGTYPE = b"0" # regular file +AREGTYPE = b"\0" # regular file +LNKTYPE = b"1" # link (inside tarfile) +SYMTYPE = b"2" # symbolic link +CHRTYPE = b"3" # character special device +BLKTYPE = b"4" # block special device +DIRTYPE = b"5" # directory +FIFOTYPE = b"6" # fifo special device +CONTTYPE = b"7" # contiguous file + +GNUTYPE_LONGNAME = b"L" # GNU tar longname +GNUTYPE_LONGLINK = b"K" # GNU tar longlink +GNUTYPE_SPARSE = b"S" # GNU tar sparse file + +XHDTYPE = b"x" # POSIX.1-2001 extended header +XGLTYPE = b"g" # POSIX.1-2001 global header +SOLARIS_XHDTYPE = b"X" # Solaris extended header + +USTAR_FORMAT = 0 # POSIX.1-1988 (ustar) format +GNU_FORMAT = 1 # GNU tar format +PAX_FORMAT = 2 # POSIX.1-2001 (pax) format +DEFAULT_FORMAT = GNU_FORMAT + +#--------------------------------------------------------- +# tarfile constants +#--------------------------------------------------------- +# File types that tarfile supports: +SUPPORTED_TYPES = (REGTYPE, AREGTYPE, LNKTYPE, + SYMTYPE, DIRTYPE, FIFOTYPE, + CONTTYPE, CHRTYPE, BLKTYPE, + GNUTYPE_LONGNAME, GNUTYPE_LONGLINK, + GNUTYPE_SPARSE) + +# File types that will be treated as a regular file. +REGULAR_TYPES = (REGTYPE, AREGTYPE, + CONTTYPE, GNUTYPE_SPARSE) + +# File types that are part of the GNU tar format. +GNU_TYPES = (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK, + GNUTYPE_SPARSE) + +# Fields from a pax header that override a TarInfo attribute. +PAX_FIELDS = ("path", "linkpath", "size", "mtime", + "uid", "gid", "uname", "gname") + +# Fields from a pax header that are affected by hdrcharset. +PAX_NAME_FIELDS = set(("path", "linkpath", "uname", "gname")) + +# Fields in a pax header that are numbers, all other fields +# are treated as strings. +PAX_NUMBER_FIELDS = { + "atime": float, + "ctime": float, + "mtime": float, + "uid": int, + "gid": int, + "size": int +} + +#--------------------------------------------------------- +# Bits used in the mode field, values in octal. +#--------------------------------------------------------- +S_IFLNK = 0o120000 # symbolic link +S_IFREG = 0o100000 # regular file +S_IFBLK = 0o060000 # block device +S_IFDIR = 0o040000 # directory +S_IFCHR = 0o020000 # character device +S_IFIFO = 0o010000 # fifo + +TSUID = 0o4000 # set UID on execution +TSGID = 0o2000 # set GID on execution +TSVTX = 0o1000 # reserved + +TUREAD = 0o400 # read by owner +TUWRITE = 0o200 # write by owner +TUEXEC = 0o100 # execute/search by owner +TGREAD = 0o040 # read by group +TGWRITE = 0o020 # write by group +TGEXEC = 0o010 # execute/search by group +TOREAD = 0o004 # read by other +TOWRITE = 0o002 # write by other +TOEXEC = 0o001 # execute/search by other + +#--------------------------------------------------------- +# initialization +#--------------------------------------------------------- +if os.name in ("nt", "ce"): + ENCODING = "utf-8" +else: + ENCODING = sys.getfilesystemencoding() + +#--------------------------------------------------------- +# Some useful functions +#--------------------------------------------------------- + +def stn(s, length, encoding, errors): + """Convert a string to a null-terminated bytes object. + """ + s = s.encode(encoding, errors) + return s[:length] + (length - len(s)) * NUL + +def nts(s, encoding, errors): + """Convert a null-terminated bytes object to a string. + """ + p = s.find(b"\0") + if p != -1: + s = s[:p] + return s.decode(encoding, errors) + +def nti(s): + """Convert a number field to a python number. + """ + # There are two possible encodings for a number field, see + # itn() below. + if s[0] != chr(0o200): + try: + n = int(nts(s, "ascii", "strict") or "0", 8) + except ValueError: + raise InvalidHeaderError("invalid header") + else: + n = 0 + for i in range(len(s) - 1): + n <<= 8 + n += ord(s[i + 1]) + return n + +def itn(n, digits=8, format=DEFAULT_FORMAT): + """Convert a python number to a number field. + """ + # POSIX 1003.1-1988 requires numbers to be encoded as a string of + # octal digits followed by a null-byte, this allows values up to + # (8**(digits-1))-1. GNU tar allows storing numbers greater than + # that if necessary. A leading 0o200 byte indicates this particular + # encoding, the following digits-1 bytes are a big-endian + # representation. This allows values up to (256**(digits-1))-1. + if 0 <= n < 8 ** (digits - 1): + s = ("%0*o" % (digits - 1, n)).encode("ascii") + NUL + else: + if format != GNU_FORMAT or n >= 256 ** (digits - 1): + raise ValueError("overflow in number field") + + if n < 0: + # XXX We mimic GNU tar's behaviour with negative numbers, + # this could raise OverflowError. + n = struct.unpack("L", struct.pack("l", n))[0] + + s = bytearray() + for i in range(digits - 1): + s.insert(0, n & 0o377) + n >>= 8 + s.insert(0, 0o200) + return s + +def calc_chksums(buf): + """Calculate the checksum for a member's header by summing up all + characters except for the chksum field which is treated as if + it was filled with spaces. According to the GNU tar sources, + some tars (Sun and NeXT) calculate chksum with signed char, + which will be different if there are chars in the buffer with + the high bit set. So we calculate two checksums, unsigned and + signed. + """ + unsigned_chksum = 256 + sum(struct.unpack("148B", buf[:148]) + struct.unpack("356B", buf[156:512])) + signed_chksum = 256 + sum(struct.unpack("148b", buf[:148]) + struct.unpack("356b", buf[156:512])) + return unsigned_chksum, signed_chksum + +def copyfileobj(src, dst, length=None): + """Copy length bytes from fileobj src to fileobj dst. + If length is None, copy the entire content. + """ + if length == 0: + return + if length is None: + while True: + buf = src.read(16*1024) + if not buf: + break + dst.write(buf) + return + + BUFSIZE = 16 * 1024 + blocks, remainder = divmod(length, BUFSIZE) + for b in range(blocks): + buf = src.read(BUFSIZE) + if len(buf) < BUFSIZE: + raise IOError("end of file reached") + dst.write(buf) + + if remainder != 0: + buf = src.read(remainder) + if len(buf) < remainder: + raise IOError("end of file reached") + dst.write(buf) + return + +filemode_table = ( + ((S_IFLNK, "l"), + (S_IFREG, "-"), + (S_IFBLK, "b"), + (S_IFDIR, "d"), + (S_IFCHR, "c"), + (S_IFIFO, "p")), + + ((TUREAD, "r"),), + ((TUWRITE, "w"),), + ((TUEXEC|TSUID, "s"), + (TSUID, "S"), + (TUEXEC, "x")), + + ((TGREAD, "r"),), + ((TGWRITE, "w"),), + ((TGEXEC|TSGID, "s"), + (TSGID, "S"), + (TGEXEC, "x")), + + ((TOREAD, "r"),), + ((TOWRITE, "w"),), + ((TOEXEC|TSVTX, "t"), + (TSVTX, "T"), + (TOEXEC, "x")) +) + +def filemode(mode): + """Convert a file's mode to a string of the form + -rwxrwxrwx. + Used by TarFile.list() + """ + perm = [] + for table in filemode_table: + for bit, char in table: + if mode & bit == bit: + perm.append(char) + break + else: + perm.append("-") + return "".join(perm) + +class TarError(Exception): + """Base exception.""" + pass +class ExtractError(TarError): + """General exception for extract errors.""" + pass +class ReadError(TarError): + """Exception for unreadable tar archives.""" + pass +class CompressionError(TarError): + """Exception for unavailable compression methods.""" + pass +class StreamError(TarError): + """Exception for unsupported operations on stream-like TarFiles.""" + pass +class HeaderError(TarError): + """Base exception for header errors.""" + pass +class EmptyHeaderError(HeaderError): + """Exception for empty headers.""" + pass +class TruncatedHeaderError(HeaderError): + """Exception for truncated headers.""" + pass +class EOFHeaderError(HeaderError): + """Exception for end of file headers.""" + pass +class InvalidHeaderError(HeaderError): + """Exception for invalid headers.""" + pass +class SubsequentHeaderError(HeaderError): + """Exception for missing and invalid extended headers.""" + pass + +#--------------------------- +# internal stream interface +#--------------------------- +class _LowLevelFile(object): + """Low-level file object. Supports reading and writing. + It is used instead of a regular file object for streaming + access. + """ + + def __init__(self, name, mode): + mode = { + "r": os.O_RDONLY, + "w": os.O_WRONLY | os.O_CREAT | os.O_TRUNC, + }[mode] + if hasattr(os, "O_BINARY"): + mode |= os.O_BINARY + self.fd = os.open(name, mode, 0o666) + + def close(self): + os.close(self.fd) + + def read(self, size): + return os.read(self.fd, size) + + def write(self, s): + os.write(self.fd, s) + +class _Stream(object): + """Class that serves as an adapter between TarFile and + a stream-like object. The stream-like object only + needs to have a read() or write() method and is accessed + blockwise. Use of gzip or bzip2 compression is possible. + A stream-like object could be for example: sys.stdin, + sys.stdout, a socket, a tape device etc. + + _Stream is intended to be used only internally. + """ + + def __init__(self, name, mode, comptype, fileobj, bufsize): + """Construct a _Stream object. + """ + self._extfileobj = True + if fileobj is None: + fileobj = _LowLevelFile(name, mode) + self._extfileobj = False + + if comptype == '*': + # Enable transparent compression detection for the + # stream interface + fileobj = _StreamProxy(fileobj) + comptype = fileobj.getcomptype() + + self.name = name or "" + self.mode = mode + self.comptype = comptype + self.fileobj = fileobj + self.bufsize = bufsize + self.buf = b"" + self.pos = 0 + self.closed = False + + try: + if comptype == "gz": + try: + import zlib + except ImportError: + raise CompressionError("zlib module is not available") + self.zlib = zlib + self.crc = zlib.crc32(b"") + if mode == "r": + self._init_read_gz() + else: + self._init_write_gz() + + if comptype == "bz2": + try: + import bz2 + except ImportError: + raise CompressionError("bz2 module is not available") + if mode == "r": + self.dbuf = b"" + self.cmp = bz2.BZ2Decompressor() + else: + self.cmp = bz2.BZ2Compressor() + except: + if not self._extfileobj: + self.fileobj.close() + self.closed = True + raise + + def __del__(self): + if hasattr(self, "closed") and not self.closed: + self.close() + + def _init_write_gz(self): + """Initialize for writing with gzip compression. + """ + self.cmp = self.zlib.compressobj(9, self.zlib.DEFLATED, + -self.zlib.MAX_WBITS, + self.zlib.DEF_MEM_LEVEL, + 0) + timestamp = struct.pack(" self.bufsize: + self.fileobj.write(self.buf[:self.bufsize]) + self.buf = self.buf[self.bufsize:] + + def close(self): + """Close the _Stream object. No operation should be + done on it afterwards. + """ + if self.closed: + return + + if self.mode == "w" and self.comptype != "tar": + self.buf += self.cmp.flush() + + if self.mode == "w" and self.buf: + self.fileobj.write(self.buf) + self.buf = b"" + if self.comptype == "gz": + # The native zlib crc is an unsigned 32-bit integer, but + # the Python wrapper implicitly casts that to a signed C + # long. So, on a 32-bit box self.crc may "look negative", + # while the same crc on a 64-bit box may "look positive". + # To avoid irksome warnings from the `struct` module, force + # it to look positive on all boxes. + self.fileobj.write(struct.pack("= 0: + blocks, remainder = divmod(pos - self.pos, self.bufsize) + for i in range(blocks): + self.read(self.bufsize) + self.read(remainder) + else: + raise StreamError("seeking backwards is not allowed") + return self.pos + + def read(self, size=None): + """Return the next size number of bytes from the stream. + If size is not defined, return all bytes of the stream + up to EOF. + """ + if size is None: + t = [] + while True: + buf = self._read(self.bufsize) + if not buf: + break + t.append(buf) + buf = "".join(t) + else: + buf = self._read(size) + self.pos += len(buf) + return buf + + def _read(self, size): + """Return size bytes from the stream. + """ + if self.comptype == "tar": + return self.__read(size) + + c = len(self.dbuf) + while c < size: + buf = self.__read(self.bufsize) + if not buf: + break + try: + buf = self.cmp.decompress(buf) + except IOError: + raise ReadError("invalid compressed data") + self.dbuf += buf + c += len(buf) + buf = self.dbuf[:size] + self.dbuf = self.dbuf[size:] + return buf + + def __read(self, size): + """Return size bytes from stream. If internal buffer is empty, + read another block from the stream. + """ + c = len(self.buf) + while c < size: + buf = self.fileobj.read(self.bufsize) + if not buf: + break + self.buf += buf + c += len(buf) + buf = self.buf[:size] + self.buf = self.buf[size:] + return buf +# class _Stream + +class _StreamProxy(object): + """Small proxy class that enables transparent compression + detection for the Stream interface (mode 'r|*'). + """ + + def __init__(self, fileobj): + self.fileobj = fileobj + self.buf = self.fileobj.read(BLOCKSIZE) + + def read(self, size): + self.read = self.fileobj.read + return self.buf + + def getcomptype(self): + if self.buf.startswith(b"\037\213\010"): + return "gz" + if self.buf.startswith(b"BZh91"): + return "bz2" + return "tar" + + def close(self): + self.fileobj.close() +# class StreamProxy + +class _BZ2Proxy(object): + """Small proxy class that enables external file object + support for "r:bz2" and "w:bz2" modes. This is actually + a workaround for a limitation in bz2 module's BZ2File + class which (unlike gzip.GzipFile) has no support for + a file object argument. + """ + + blocksize = 16 * 1024 + + def __init__(self, fileobj, mode): + self.fileobj = fileobj + self.mode = mode + self.name = getattr(self.fileobj, "name", None) + self.init() + + def init(self): + import bz2 + self.pos = 0 + if self.mode == "r": + self.bz2obj = bz2.BZ2Decompressor() + self.fileobj.seek(0) + self.buf = b"" + else: + self.bz2obj = bz2.BZ2Compressor() + + def read(self, size): + x = len(self.buf) + while x < size: + raw = self.fileobj.read(self.blocksize) + if not raw: + break + data = self.bz2obj.decompress(raw) + self.buf += data + x += len(data) + + buf = self.buf[:size] + self.buf = self.buf[size:] + self.pos += len(buf) + return buf + + def seek(self, pos): + if pos < self.pos: + self.init() + self.read(pos - self.pos) + + def tell(self): + return self.pos + + def write(self, data): + self.pos += len(data) + raw = self.bz2obj.compress(data) + self.fileobj.write(raw) + + def close(self): + if self.mode == "w": + raw = self.bz2obj.flush() + self.fileobj.write(raw) +# class _BZ2Proxy + +#------------------------ +# Extraction file object +#------------------------ +class _FileInFile(object): + """A thin wrapper around an existing file object that + provides a part of its data as an individual file + object. + """ + + def __init__(self, fileobj, offset, size, blockinfo=None): + self.fileobj = fileobj + self.offset = offset + self.size = size + self.position = 0 + + if blockinfo is None: + blockinfo = [(0, size)] + + # Construct a map with data and zero blocks. + self.map_index = 0 + self.map = [] + lastpos = 0 + realpos = self.offset + for offset, size in blockinfo: + if offset > lastpos: + self.map.append((False, lastpos, offset, None)) + self.map.append((True, offset, offset + size, realpos)) + realpos += size + lastpos = offset + size + if lastpos < self.size: + self.map.append((False, lastpos, self.size, None)) + + def seekable(self): + if not hasattr(self.fileobj, "seekable"): + # XXX gzip.GzipFile and bz2.BZ2File + return True + return self.fileobj.seekable() + + def tell(self): + """Return the current file position. + """ + return self.position + + def seek(self, position): + """Seek to a position in the file. + """ + self.position = position + + def read(self, size=None): + """Read data from the file. + """ + if size is None: + size = self.size - self.position + else: + size = min(size, self.size - self.position) + + buf = b"" + while size > 0: + while True: + data, start, stop, offset = self.map[self.map_index] + if start <= self.position < stop: + break + else: + self.map_index += 1 + if self.map_index == len(self.map): + self.map_index = 0 + length = min(size, stop - self.position) + if data: + self.fileobj.seek(offset + (self.position - start)) + buf += self.fileobj.read(length) + else: + buf += NUL * length + size -= length + self.position += length + return buf +#class _FileInFile + + +class ExFileObject(object): + """File-like object for reading an archive member. + Is returned by TarFile.extractfile(). + """ + blocksize = 1024 + + def __init__(self, tarfile, tarinfo): + self.fileobj = _FileInFile(tarfile.fileobj, + tarinfo.offset_data, + tarinfo.size, + tarinfo.sparse) + self.name = tarinfo.name + self.mode = "r" + self.closed = False + self.size = tarinfo.size + + self.position = 0 + self.buffer = b"" + + def readable(self): + return True + + def writable(self): + return False + + def seekable(self): + return self.fileobj.seekable() + + def read(self, size=None): + """Read at most size bytes from the file. If size is not + present or None, read all data until EOF is reached. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + buf = b"" + if self.buffer: + if size is None: + buf = self.buffer + self.buffer = b"" + else: + buf = self.buffer[:size] + self.buffer = self.buffer[size:] + + if size is None: + buf += self.fileobj.read() + else: + buf += self.fileobj.read(size - len(buf)) + + self.position += len(buf) + return buf + + # XXX TextIOWrapper uses the read1() method. + read1 = read + + def readline(self, size=-1): + """Read one entire line from the file. If size is present + and non-negative, return a string with at most that + size, which may be an incomplete line. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + pos = self.buffer.find(b"\n") + 1 + if pos == 0: + # no newline found. + while True: + buf = self.fileobj.read(self.blocksize) + self.buffer += buf + if not buf or b"\n" in buf: + pos = self.buffer.find(b"\n") + 1 + if pos == 0: + # no newline found. + pos = len(self.buffer) + break + + if size != -1: + pos = min(size, pos) + + buf = self.buffer[:pos] + self.buffer = self.buffer[pos:] + self.position += len(buf) + return buf + + def readlines(self): + """Return a list with all remaining lines. + """ + result = [] + while True: + line = self.readline() + if not line: break + result.append(line) + return result + + def tell(self): + """Return the current file position. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + return self.position + + def seek(self, pos, whence=os.SEEK_SET): + """Seek to a position in the file. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + if whence == os.SEEK_SET: + self.position = min(max(pos, 0), self.size) + elif whence == os.SEEK_CUR: + if pos < 0: + self.position = max(self.position + pos, 0) + else: + self.position = min(self.position + pos, self.size) + elif whence == os.SEEK_END: + self.position = max(min(self.size + pos, self.size), 0) + else: + raise ValueError("Invalid argument") + + self.buffer = b"" + self.fileobj.seek(self.position) + + def close(self): + """Close the file object. + """ + self.closed = True + + def __iter__(self): + """Get an iterator over the file's lines. + """ + while True: + line = self.readline() + if not line: + break + yield line +#class ExFileObject + +#------------------ +# Exported Classes +#------------------ +class TarInfo(object): + """Informational class which holds the details about an + archive member given by a tar header block. + TarInfo objects are returned by TarFile.getmember(), + TarFile.getmembers() and TarFile.gettarinfo() and are + usually created internally. + """ + + __slots__ = ("name", "mode", "uid", "gid", "size", "mtime", + "chksum", "type", "linkname", "uname", "gname", + "devmajor", "devminor", + "offset", "offset_data", "pax_headers", "sparse", + "tarfile", "_sparse_structs", "_link_target") + + def __init__(self, name=""): + """Construct a TarInfo object. name is the optional name + of the member. + """ + self.name = name # member name + self.mode = 0o644 # file permissions + self.uid = 0 # user id + self.gid = 0 # group id + self.size = 0 # file size + self.mtime = 0 # modification time + self.chksum = 0 # header checksum + self.type = REGTYPE # member type + self.linkname = "" # link name + self.uname = "" # user name + self.gname = "" # group name + self.devmajor = 0 # device major number + self.devminor = 0 # device minor number + + self.offset = 0 # the tar header starts here + self.offset_data = 0 # the file's data starts here + + self.sparse = None # sparse member information + self.pax_headers = {} # pax header information + + # In pax headers the "name" and "linkname" field are called + # "path" and "linkpath". + def _getpath(self): + return self.name + def _setpath(self, name): + self.name = name + path = property(_getpath, _setpath) + + def _getlinkpath(self): + return self.linkname + def _setlinkpath(self, linkname): + self.linkname = linkname + linkpath = property(_getlinkpath, _setlinkpath) + + def __repr__(self): + return "<%s %r at %#x>" % (self.__class__.__name__,self.name,id(self)) + + def get_info(self): + """Return the TarInfo's attributes as a dictionary. + """ + info = { + "name": self.name, + "mode": self.mode & 0o7777, + "uid": self.uid, + "gid": self.gid, + "size": self.size, + "mtime": self.mtime, + "chksum": self.chksum, + "type": self.type, + "linkname": self.linkname, + "uname": self.uname, + "gname": self.gname, + "devmajor": self.devmajor, + "devminor": self.devminor + } + + if info["type"] == DIRTYPE and not info["name"].endswith("/"): + info["name"] += "/" + + return info + + def tobuf(self, format=DEFAULT_FORMAT, encoding=ENCODING, errors="surrogateescape"): + """Return a tar header as a string of 512 byte blocks. + """ + info = self.get_info() + + if format == USTAR_FORMAT: + return self.create_ustar_header(info, encoding, errors) + elif format == GNU_FORMAT: + return self.create_gnu_header(info, encoding, errors) + elif format == PAX_FORMAT: + return self.create_pax_header(info, encoding) + else: + raise ValueError("invalid format") + + def create_ustar_header(self, info, encoding, errors): + """Return the object as a ustar header block. + """ + info["magic"] = POSIX_MAGIC + + if len(info["linkname"]) > LENGTH_LINK: + raise ValueError("linkname is too long") + + if len(info["name"]) > LENGTH_NAME: + info["prefix"], info["name"] = self._posix_split_name(info["name"]) + + return self._create_header(info, USTAR_FORMAT, encoding, errors) + + def create_gnu_header(self, info, encoding, errors): + """Return the object as a GNU header block sequence. + """ + info["magic"] = GNU_MAGIC + + buf = b"" + if len(info["linkname"]) > LENGTH_LINK: + buf += self._create_gnu_long_header(info["linkname"], GNUTYPE_LONGLINK, encoding, errors) + + if len(info["name"]) > LENGTH_NAME: + buf += self._create_gnu_long_header(info["name"], GNUTYPE_LONGNAME, encoding, errors) + + return buf + self._create_header(info, GNU_FORMAT, encoding, errors) + + def create_pax_header(self, info, encoding): + """Return the object as a ustar header block. If it cannot be + represented this way, prepend a pax extended header sequence + with supplement information. + """ + info["magic"] = POSIX_MAGIC + pax_headers = self.pax_headers.copy() + + # Test string fields for values that exceed the field length or cannot + # be represented in ASCII encoding. + for name, hname, length in ( + ("name", "path", LENGTH_NAME), ("linkname", "linkpath", LENGTH_LINK), + ("uname", "uname", 32), ("gname", "gname", 32)): + + if hname in pax_headers: + # The pax header has priority. + continue + + # Try to encode the string as ASCII. + try: + info[name].encode("ascii", "strict") + except UnicodeEncodeError: + pax_headers[hname] = info[name] + continue + + if len(info[name]) > length: + pax_headers[hname] = info[name] + + # Test number fields for values that exceed the field limit or values + # that like to be stored as float. + for name, digits in (("uid", 8), ("gid", 8), ("size", 12), ("mtime", 12)): + if name in pax_headers: + # The pax header has priority. Avoid overflow. + info[name] = 0 + continue + + val = info[name] + if not 0 <= val < 8 ** (digits - 1) or isinstance(val, float): + pax_headers[name] = str(val) + info[name] = 0 + + # Create a pax extended header if necessary. + if pax_headers: + buf = self._create_pax_generic_header(pax_headers, XHDTYPE, encoding) + else: + buf = b"" + + return buf + self._create_header(info, USTAR_FORMAT, "ascii", "replace") + + @classmethod + def create_pax_global_header(cls, pax_headers): + """Return the object as a pax global header block sequence. + """ + return cls._create_pax_generic_header(pax_headers, XGLTYPE, "utf8") + + def _posix_split_name(self, name): + """Split a name longer than 100 chars into a prefix + and a name part. + """ + prefix = name[:LENGTH_PREFIX + 1] + while prefix and prefix[-1] != "/": + prefix = prefix[:-1] + + name = name[len(prefix):] + prefix = prefix[:-1] + + if not prefix or len(name) > LENGTH_NAME: + raise ValueError("name is too long") + return prefix, name + + @staticmethod + def _create_header(info, format, encoding, errors): + """Return a header block. info is a dictionary with file + information, format must be one of the *_FORMAT constants. + """ + parts = [ + stn(info.get("name", ""), 100, encoding, errors), + itn(info.get("mode", 0) & 0o7777, 8, format), + itn(info.get("uid", 0), 8, format), + itn(info.get("gid", 0), 8, format), + itn(info.get("size", 0), 12, format), + itn(info.get("mtime", 0), 12, format), + b" ", # checksum field + info.get("type", REGTYPE), + stn(info.get("linkname", ""), 100, encoding, errors), + info.get("magic", POSIX_MAGIC), + stn(info.get("uname", ""), 32, encoding, errors), + stn(info.get("gname", ""), 32, encoding, errors), + itn(info.get("devmajor", 0), 8, format), + itn(info.get("devminor", 0), 8, format), + stn(info.get("prefix", ""), 155, encoding, errors) + ] + + buf = struct.pack("%ds" % BLOCKSIZE, b"".join(parts)) + chksum = calc_chksums(buf[-BLOCKSIZE:])[0] + buf = buf[:-364] + ("%06o\0" % chksum).encode("ascii") + buf[-357:] + return buf + + @staticmethod + def _create_payload(payload): + """Return the string payload filled with zero bytes + up to the next 512 byte border. + """ + blocks, remainder = divmod(len(payload), BLOCKSIZE) + if remainder > 0: + payload += (BLOCKSIZE - remainder) * NUL + return payload + + @classmethod + def _create_gnu_long_header(cls, name, type, encoding, errors): + """Return a GNUTYPE_LONGNAME or GNUTYPE_LONGLINK sequence + for name. + """ + name = name.encode(encoding, errors) + NUL + + info = {} + info["name"] = "././@LongLink" + info["type"] = type + info["size"] = len(name) + info["magic"] = GNU_MAGIC + + # create extended header + name blocks. + return cls._create_header(info, USTAR_FORMAT, encoding, errors) + \ + cls._create_payload(name) + + @classmethod + def _create_pax_generic_header(cls, pax_headers, type, encoding): + """Return a POSIX.1-2008 extended or global header sequence + that contains a list of keyword, value pairs. The values + must be strings. + """ + # Check if one of the fields contains surrogate characters and thereby + # forces hdrcharset=BINARY, see _proc_pax() for more information. + binary = False + for keyword, value in pax_headers.items(): + try: + value.encode("utf8", "strict") + except UnicodeEncodeError: + binary = True + break + + records = b"" + if binary: + # Put the hdrcharset field at the beginning of the header. + records += b"21 hdrcharset=BINARY\n" + + for keyword, value in pax_headers.items(): + keyword = keyword.encode("utf8") + if binary: + # Try to restore the original byte representation of `value'. + # Needless to say, that the encoding must match the string. + value = value.encode(encoding, "surrogateescape") + else: + value = value.encode("utf8") + + l = len(keyword) + len(value) + 3 # ' ' + '=' + '\n' + n = p = 0 + while True: + n = l + len(str(p)) + if n == p: + break + p = n + records += bytes(str(p), "ascii") + b" " + keyword + b"=" + value + b"\n" + + # We use a hardcoded "././@PaxHeader" name like star does + # instead of the one that POSIX recommends. + info = {} + info["name"] = "././@PaxHeader" + info["type"] = type + info["size"] = len(records) + info["magic"] = POSIX_MAGIC + + # Create pax header + record blocks. + return cls._create_header(info, USTAR_FORMAT, "ascii", "replace") + \ + cls._create_payload(records) + + @classmethod + def frombuf(cls, buf, encoding, errors): + """Construct a TarInfo object from a 512 byte bytes object. + """ + if len(buf) == 0: + raise EmptyHeaderError("empty header") + if len(buf) != BLOCKSIZE: + raise TruncatedHeaderError("truncated header") + if buf.count(NUL) == BLOCKSIZE: + raise EOFHeaderError("end of file header") + + chksum = nti(buf[148:156]) + if chksum not in calc_chksums(buf): + raise InvalidHeaderError("bad checksum") + + obj = cls() + obj.name = nts(buf[0:100], encoding, errors) + obj.mode = nti(buf[100:108]) + obj.uid = nti(buf[108:116]) + obj.gid = nti(buf[116:124]) + obj.size = nti(buf[124:136]) + obj.mtime = nti(buf[136:148]) + obj.chksum = chksum + obj.type = buf[156:157] + obj.linkname = nts(buf[157:257], encoding, errors) + obj.uname = nts(buf[265:297], encoding, errors) + obj.gname = nts(buf[297:329], encoding, errors) + obj.devmajor = nti(buf[329:337]) + obj.devminor = nti(buf[337:345]) + prefix = nts(buf[345:500], encoding, errors) + + # Old V7 tar format represents a directory as a regular + # file with a trailing slash. + if obj.type == AREGTYPE and obj.name.endswith("/"): + obj.type = DIRTYPE + + # The old GNU sparse format occupies some of the unused + # space in the buffer for up to 4 sparse structures. + # Save the them for later processing in _proc_sparse(). + if obj.type == GNUTYPE_SPARSE: + pos = 386 + structs = [] + for i in range(4): + try: + offset = nti(buf[pos:pos + 12]) + numbytes = nti(buf[pos + 12:pos + 24]) + except ValueError: + break + structs.append((offset, numbytes)) + pos += 24 + isextended = bool(buf[482]) + origsize = nti(buf[483:495]) + obj._sparse_structs = (structs, isextended, origsize) + + # Remove redundant slashes from directories. + if obj.isdir(): + obj.name = obj.name.rstrip("/") + + # Reconstruct a ustar longname. + if prefix and obj.type not in GNU_TYPES: + obj.name = prefix + "/" + obj.name + return obj + + @classmethod + def fromtarfile(cls, tarfile): + """Return the next TarInfo object from TarFile object + tarfile. + """ + buf = tarfile.fileobj.read(BLOCKSIZE) + obj = cls.frombuf(buf, tarfile.encoding, tarfile.errors) + obj.offset = tarfile.fileobj.tell() - BLOCKSIZE + return obj._proc_member(tarfile) + + #-------------------------------------------------------------------------- + # The following are methods that are called depending on the type of a + # member. The entry point is _proc_member() which can be overridden in a + # subclass to add custom _proc_*() methods. A _proc_*() method MUST + # implement the following + # operations: + # 1. Set self.offset_data to the position where the data blocks begin, + # if there is data that follows. + # 2. Set tarfile.offset to the position where the next member's header will + # begin. + # 3. Return self or another valid TarInfo object. + def _proc_member(self, tarfile): + """Choose the right processing method depending on + the type and call it. + """ + if self.type in (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK): + return self._proc_gnulong(tarfile) + elif self.type == GNUTYPE_SPARSE: + return self._proc_sparse(tarfile) + elif self.type in (XHDTYPE, XGLTYPE, SOLARIS_XHDTYPE): + return self._proc_pax(tarfile) + else: + return self._proc_builtin(tarfile) + + def _proc_builtin(self, tarfile): + """Process a builtin type or an unknown type which + will be treated as a regular file. + """ + self.offset_data = tarfile.fileobj.tell() + offset = self.offset_data + if self.isreg() or self.type not in SUPPORTED_TYPES: + # Skip the following data blocks. + offset += self._block(self.size) + tarfile.offset = offset + + # Patch the TarInfo object with saved global + # header information. + self._apply_pax_info(tarfile.pax_headers, tarfile.encoding, tarfile.errors) + + return self + + def _proc_gnulong(self, tarfile): + """Process the blocks that hold a GNU longname + or longlink member. + """ + buf = tarfile.fileobj.read(self._block(self.size)) + + # Fetch the next header and process it. + try: + next = self.fromtarfile(tarfile) + except HeaderError: + raise SubsequentHeaderError("missing or bad subsequent header") + + # Patch the TarInfo object from the next header with + # the longname information. + next.offset = self.offset + if self.type == GNUTYPE_LONGNAME: + next.name = nts(buf, tarfile.encoding, tarfile.errors) + elif self.type == GNUTYPE_LONGLINK: + next.linkname = nts(buf, tarfile.encoding, tarfile.errors) + + return next + + def _proc_sparse(self, tarfile): + """Process a GNU sparse header plus extra headers. + """ + # We already collected some sparse structures in frombuf(). + structs, isextended, origsize = self._sparse_structs + del self._sparse_structs + + # Collect sparse structures from extended header blocks. + while isextended: + buf = tarfile.fileobj.read(BLOCKSIZE) + pos = 0 + for i in range(21): + try: + offset = nti(buf[pos:pos + 12]) + numbytes = nti(buf[pos + 12:pos + 24]) + except ValueError: + break + if offset and numbytes: + structs.append((offset, numbytes)) + pos += 24 + isextended = bool(buf[504]) + self.sparse = structs + + self.offset_data = tarfile.fileobj.tell() + tarfile.offset = self.offset_data + self._block(self.size) + self.size = origsize + return self + + def _proc_pax(self, tarfile): + """Process an extended or global header as described in + POSIX.1-2008. + """ + # Read the header information. + buf = tarfile.fileobj.read(self._block(self.size)) + + # A pax header stores supplemental information for either + # the following file (extended) or all following files + # (global). + if self.type == XGLTYPE: + pax_headers = tarfile.pax_headers + else: + pax_headers = tarfile.pax_headers.copy() + + # Check if the pax header contains a hdrcharset field. This tells us + # the encoding of the path, linkpath, uname and gname fields. Normally, + # these fields are UTF-8 encoded but since POSIX.1-2008 tar + # implementations are allowed to store them as raw binary strings if + # the translation to UTF-8 fails. + match = re.search(br"\d+ hdrcharset=([^\n]+)\n", buf) + if match is not None: + pax_headers["hdrcharset"] = match.group(1).decode("utf8") + + # For the time being, we don't care about anything other than "BINARY". + # The only other value that is currently allowed by the standard is + # "ISO-IR 10646 2000 UTF-8" in other words UTF-8. + hdrcharset = pax_headers.get("hdrcharset") + if hdrcharset == "BINARY": + encoding = tarfile.encoding + else: + encoding = "utf8" + + # Parse pax header information. A record looks like that: + # "%d %s=%s\n" % (length, keyword, value). length is the size + # of the complete record including the length field itself and + # the newline. keyword and value are both UTF-8 encoded strings. + regex = re.compile(br"(\d+) ([^=]+)=") + pos = 0 + while True: + match = regex.match(buf, pos) + if not match: + break + + length, keyword = match.groups() + length = int(length) + value = buf[match.end(2) + 1:match.start(1) + length - 1] + + # Normally, we could just use "utf8" as the encoding and "strict" + # as the error handler, but we better not take the risk. For + # example, GNU tar <= 1.23 is known to store filenames it cannot + # translate to UTF-8 as raw strings (unfortunately without a + # hdrcharset=BINARY header). + # We first try the strict standard encoding, and if that fails we + # fall back on the user's encoding and error handler. + keyword = self._decode_pax_field(keyword, "utf8", "utf8", + tarfile.errors) + if keyword in PAX_NAME_FIELDS: + value = self._decode_pax_field(value, encoding, tarfile.encoding, + tarfile.errors) + else: + value = self._decode_pax_field(value, "utf8", "utf8", + tarfile.errors) + + pax_headers[keyword] = value + pos += length + + # Fetch the next header. + try: + next = self.fromtarfile(tarfile) + except HeaderError: + raise SubsequentHeaderError("missing or bad subsequent header") + + # Process GNU sparse information. + if "GNU.sparse.map" in pax_headers: + # GNU extended sparse format version 0.1. + self._proc_gnusparse_01(next, pax_headers) + + elif "GNU.sparse.size" in pax_headers: + # GNU extended sparse format version 0.0. + self._proc_gnusparse_00(next, pax_headers, buf) + + elif pax_headers.get("GNU.sparse.major") == "1" and pax_headers.get("GNU.sparse.minor") == "0": + # GNU extended sparse format version 1.0. + self._proc_gnusparse_10(next, pax_headers, tarfile) + + if self.type in (XHDTYPE, SOLARIS_XHDTYPE): + # Patch the TarInfo object with the extended header info. + next._apply_pax_info(pax_headers, tarfile.encoding, tarfile.errors) + next.offset = self.offset + + if "size" in pax_headers: + # If the extended header replaces the size field, + # we need to recalculate the offset where the next + # header starts. + offset = next.offset_data + if next.isreg() or next.type not in SUPPORTED_TYPES: + offset += next._block(next.size) + tarfile.offset = offset + + return next + + def _proc_gnusparse_00(self, next, pax_headers, buf): + """Process a GNU tar extended sparse header, version 0.0. + """ + offsets = [] + for match in re.finditer(br"\d+ GNU.sparse.offset=(\d+)\n", buf): + offsets.append(int(match.group(1))) + numbytes = [] + for match in re.finditer(br"\d+ GNU.sparse.numbytes=(\d+)\n", buf): + numbytes.append(int(match.group(1))) + next.sparse = list(zip(offsets, numbytes)) + + def _proc_gnusparse_01(self, next, pax_headers): + """Process a GNU tar extended sparse header, version 0.1. + """ + sparse = [int(x) for x in pax_headers["GNU.sparse.map"].split(",")] + next.sparse = list(zip(sparse[::2], sparse[1::2])) + + def _proc_gnusparse_10(self, next, pax_headers, tarfile): + """Process a GNU tar extended sparse header, version 1.0. + """ + fields = None + sparse = [] + buf = tarfile.fileobj.read(BLOCKSIZE) + fields, buf = buf.split(b"\n", 1) + fields = int(fields) + while len(sparse) < fields * 2: + if b"\n" not in buf: + buf += tarfile.fileobj.read(BLOCKSIZE) + number, buf = buf.split(b"\n", 1) + sparse.append(int(number)) + next.offset_data = tarfile.fileobj.tell() + next.sparse = list(zip(sparse[::2], sparse[1::2])) + + def _apply_pax_info(self, pax_headers, encoding, errors): + """Replace fields with supplemental information from a previous + pax extended or global header. + """ + for keyword, value in pax_headers.items(): + if keyword == "GNU.sparse.name": + setattr(self, "path", value) + elif keyword == "GNU.sparse.size": + setattr(self, "size", int(value)) + elif keyword == "GNU.sparse.realsize": + setattr(self, "size", int(value)) + elif keyword in PAX_FIELDS: + if keyword in PAX_NUMBER_FIELDS: + try: + value = PAX_NUMBER_FIELDS[keyword](value) + except ValueError: + value = 0 + if keyword == "path": + value = value.rstrip("/") + setattr(self, keyword, value) + + self.pax_headers = pax_headers.copy() + + def _decode_pax_field(self, value, encoding, fallback_encoding, fallback_errors): + """Decode a single field from a pax record. + """ + try: + return value.decode(encoding, "strict") + except UnicodeDecodeError: + return value.decode(fallback_encoding, fallback_errors) + + def _block(self, count): + """Round up a byte count by BLOCKSIZE and return it, + e.g. _block(834) => 1024. + """ + blocks, remainder = divmod(count, BLOCKSIZE) + if remainder: + blocks += 1 + return blocks * BLOCKSIZE + + def isreg(self): + return self.type in REGULAR_TYPES + def isfile(self): + return self.isreg() + def isdir(self): + return self.type == DIRTYPE + def issym(self): + return self.type == SYMTYPE + def islnk(self): + return self.type == LNKTYPE + def ischr(self): + return self.type == CHRTYPE + def isblk(self): + return self.type == BLKTYPE + def isfifo(self): + return self.type == FIFOTYPE + def issparse(self): + return self.sparse is not None + def isdev(self): + return self.type in (CHRTYPE, BLKTYPE, FIFOTYPE) +# class TarInfo + +class TarFile(object): + """The TarFile Class provides an interface to tar archives. + """ + + debug = 0 # May be set from 0 (no msgs) to 3 (all msgs) + + dereference = False # If true, add content of linked file to the + # tar file, else the link. + + ignore_zeros = False # If true, skips empty or invalid blocks and + # continues processing. + + errorlevel = 1 # If 0, fatal errors only appear in debug + # messages (if debug >= 0). If > 0, errors + # are passed to the caller as exceptions. + + format = DEFAULT_FORMAT # The format to use when creating an archive. + + encoding = ENCODING # Encoding for 8-bit character strings. + + errors = None # Error handler for unicode conversion. + + tarinfo = TarInfo # The default TarInfo class to use. + + fileobject = ExFileObject # The default ExFileObject class to use. + + def __init__(self, name=None, mode="r", fileobj=None, format=None, + tarinfo=None, dereference=None, ignore_zeros=None, encoding=None, + errors="surrogateescape", pax_headers=None, debug=None, errorlevel=None): + """Open an (uncompressed) tar archive `name'. `mode' is either 'r' to + read from an existing archive, 'a' to append data to an existing + file or 'w' to create a new file overwriting an existing one. `mode' + defaults to 'r'. + If `fileobj' is given, it is used for reading or writing data. If it + can be determined, `mode' is overridden by `fileobj's mode. + `fileobj' is not closed, when TarFile is closed. + """ + if len(mode) > 1 or mode not in "raw": + raise ValueError("mode must be 'r', 'a' or 'w'") + self.mode = mode + self._mode = {"r": "rb", "a": "r+b", "w": "wb"}[mode] + + if not fileobj: + if self.mode == "a" and not os.path.exists(name): + # Create nonexistent files in append mode. + self.mode = "w" + self._mode = "wb" + fileobj = bltn_open(name, self._mode) + self._extfileobj = False + else: + if name is None and hasattr(fileobj, "name"): + name = fileobj.name + if hasattr(fileobj, "mode"): + self._mode = fileobj.mode + self._extfileobj = True + self.name = os.path.abspath(name) if name else None + self.fileobj = fileobj + + # Init attributes. + if format is not None: + self.format = format + if tarinfo is not None: + self.tarinfo = tarinfo + if dereference is not None: + self.dereference = dereference + if ignore_zeros is not None: + self.ignore_zeros = ignore_zeros + if encoding is not None: + self.encoding = encoding + self.errors = errors + + if pax_headers is not None and self.format == PAX_FORMAT: + self.pax_headers = pax_headers + else: + self.pax_headers = {} + + if debug is not None: + self.debug = debug + if errorlevel is not None: + self.errorlevel = errorlevel + + # Init datastructures. + self.closed = False + self.members = [] # list of members as TarInfo objects + self._loaded = False # flag if all members have been read + self.offset = self.fileobj.tell() + # current position in the archive file + self.inodes = {} # dictionary caching the inodes of + # archive members already added + + try: + if self.mode == "r": + self.firstmember = None + self.firstmember = self.next() + + if self.mode == "a": + # Move to the end of the archive, + # before the first empty block. + while True: + self.fileobj.seek(self.offset) + try: + tarinfo = self.tarinfo.fromtarfile(self) + self.members.append(tarinfo) + except EOFHeaderError: + self.fileobj.seek(self.offset) + break + except HeaderError as e: + raise ReadError(str(e)) + + if self.mode in "aw": + self._loaded = True + + if self.pax_headers: + buf = self.tarinfo.create_pax_global_header(self.pax_headers.copy()) + self.fileobj.write(buf) + self.offset += len(buf) + except: + if not self._extfileobj: + self.fileobj.close() + self.closed = True + raise + + #-------------------------------------------------------------------------- + # Below are the classmethods which act as alternate constructors to the + # TarFile class. The open() method is the only one that is needed for + # public use; it is the "super"-constructor and is able to select an + # adequate "sub"-constructor for a particular compression using the mapping + # from OPEN_METH. + # + # This concept allows one to subclass TarFile without losing the comfort of + # the super-constructor. A sub-constructor is registered and made available + # by adding it to the mapping in OPEN_METH. + + @classmethod + def open(cls, name=None, mode="r", fileobj=None, bufsize=RECORDSIZE, **kwargs): + """Open a tar archive for reading, writing or appending. Return + an appropriate TarFile class. + + mode: + 'r' or 'r:*' open for reading with transparent compression + 'r:' open for reading exclusively uncompressed + 'r:gz' open for reading with gzip compression + 'r:bz2' open for reading with bzip2 compression + 'a' or 'a:' open for appending, creating the file if necessary + 'w' or 'w:' open for writing without compression + 'w:gz' open for writing with gzip compression + 'w:bz2' open for writing with bzip2 compression + + 'r|*' open a stream of tar blocks with transparent compression + 'r|' open an uncompressed stream of tar blocks for reading + 'r|gz' open a gzip compressed stream of tar blocks + 'r|bz2' open a bzip2 compressed stream of tar blocks + 'w|' open an uncompressed stream for writing + 'w|gz' open a gzip compressed stream for writing + 'w|bz2' open a bzip2 compressed stream for writing + """ + + if not name and not fileobj: + raise ValueError("nothing to open") + + if mode in ("r", "r:*"): + # Find out which *open() is appropriate for opening the file. + for comptype in cls.OPEN_METH: + func = getattr(cls, cls.OPEN_METH[comptype]) + if fileobj is not None: + saved_pos = fileobj.tell() + try: + return func(name, "r", fileobj, **kwargs) + except (ReadError, CompressionError) as e: + if fileobj is not None: + fileobj.seek(saved_pos) + continue + raise ReadError("file could not be opened successfully") + + elif ":" in mode: + filemode, comptype = mode.split(":", 1) + filemode = filemode or "r" + comptype = comptype or "tar" + + # Select the *open() function according to + # given compression. + if comptype in cls.OPEN_METH: + func = getattr(cls, cls.OPEN_METH[comptype]) + else: + raise CompressionError("unknown compression type %r" % comptype) + return func(name, filemode, fileobj, **kwargs) + + elif "|" in mode: + filemode, comptype = mode.split("|", 1) + filemode = filemode or "r" + comptype = comptype or "tar" + + if filemode not in "rw": + raise ValueError("mode must be 'r' or 'w'") + + stream = _Stream(name, filemode, comptype, fileobj, bufsize) + try: + t = cls(name, filemode, stream, **kwargs) + except: + stream.close() + raise + t._extfileobj = False + return t + + elif mode in "aw": + return cls.taropen(name, mode, fileobj, **kwargs) + + raise ValueError("undiscernible mode") + + @classmethod + def taropen(cls, name, mode="r", fileobj=None, **kwargs): + """Open uncompressed tar archive name for reading or writing. + """ + if len(mode) > 1 or mode not in "raw": + raise ValueError("mode must be 'r', 'a' or 'w'") + return cls(name, mode, fileobj, **kwargs) + + @classmethod + def gzopen(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs): + """Open gzip compressed tar archive name for reading or writing. + Appending is not allowed. + """ + if len(mode) > 1 or mode not in "rw": + raise ValueError("mode must be 'r' or 'w'") + + try: + import gzip + gzip.GzipFile + except (ImportError, AttributeError): + raise CompressionError("gzip module is not available") + + extfileobj = fileobj is not None + try: + fileobj = gzip.GzipFile(name, mode + "b", compresslevel, fileobj) + t = cls.taropen(name, mode, fileobj, **kwargs) + except IOError: + if not extfileobj and fileobj is not None: + fileobj.close() + if fileobj is None: + raise + raise ReadError("not a gzip file") + except: + if not extfileobj and fileobj is not None: + fileobj.close() + raise + t._extfileobj = extfileobj + return t + + @classmethod + def bz2open(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs): + """Open bzip2 compressed tar archive name for reading or writing. + Appending is not allowed. + """ + if len(mode) > 1 or mode not in "rw": + raise ValueError("mode must be 'r' or 'w'.") + + try: + import bz2 + except ImportError: + raise CompressionError("bz2 module is not available") + + if fileobj is not None: + fileobj = _BZ2Proxy(fileobj, mode) + else: + fileobj = bz2.BZ2File(name, mode, compresslevel=compresslevel) + + try: + t = cls.taropen(name, mode, fileobj, **kwargs) + except (IOError, EOFError): + fileobj.close() + raise ReadError("not a bzip2 file") + t._extfileobj = False + return t + + # All *open() methods are registered here. + OPEN_METH = { + "tar": "taropen", # uncompressed tar + "gz": "gzopen", # gzip compressed tar + "bz2": "bz2open" # bzip2 compressed tar + } + + #-------------------------------------------------------------------------- + # The public methods which TarFile provides: + + def close(self): + """Close the TarFile. In write-mode, two finishing zero blocks are + appended to the archive. + """ + if self.closed: + return + + if self.mode in "aw": + self.fileobj.write(NUL * (BLOCKSIZE * 2)) + self.offset += (BLOCKSIZE * 2) + # fill up the end with zero-blocks + # (like option -b20 for tar does) + blocks, remainder = divmod(self.offset, RECORDSIZE) + if remainder > 0: + self.fileobj.write(NUL * (RECORDSIZE - remainder)) + + if not self._extfileobj: + self.fileobj.close() + self.closed = True + + def getmember(self, name): + """Return a TarInfo object for member `name'. If `name' can not be + found in the archive, KeyError is raised. If a member occurs more + than once in the archive, its last occurrence is assumed to be the + most up-to-date version. + """ + tarinfo = self._getmember(name) + if tarinfo is None: + raise KeyError("filename %r not found" % name) + return tarinfo + + def getmembers(self): + """Return the members of the archive as a list of TarInfo objects. The + list has the same order as the members in the archive. + """ + self._check() + if not self._loaded: # if we want to obtain a list of + self._load() # all members, we first have to + # scan the whole archive. + return self.members + + def getnames(self): + """Return the members of the archive as a list of their names. It has + the same order as the list returned by getmembers(). + """ + return [tarinfo.name for tarinfo in self.getmembers()] + + def gettarinfo(self, name=None, arcname=None, fileobj=None): + """Create a TarInfo object for either the file `name' or the file + object `fileobj' (using os.fstat on its file descriptor). You can + modify some of the TarInfo's attributes before you add it using + addfile(). If given, `arcname' specifies an alternative name for the + file in the archive. + """ + self._check("aw") + + # When fileobj is given, replace name by + # fileobj's real name. + if fileobj is not None: + name = fileobj.name + + # Building the name of the member in the archive. + # Backward slashes are converted to forward slashes, + # Absolute paths are turned to relative paths. + if arcname is None: + arcname = name + drv, arcname = os.path.splitdrive(arcname) + arcname = arcname.replace(os.sep, "/") + arcname = arcname.lstrip("/") + + # Now, fill the TarInfo object with + # information specific for the file. + tarinfo = self.tarinfo() + tarinfo.tarfile = self + + # Use os.stat or os.lstat, depending on platform + # and if symlinks shall be resolved. + if fileobj is None: + if hasattr(os, "lstat") and not self.dereference: + statres = os.lstat(name) + else: + statres = os.stat(name) + else: + statres = os.fstat(fileobj.fileno()) + linkname = "" + + stmd = statres.st_mode + if stat.S_ISREG(stmd): + inode = (statres.st_ino, statres.st_dev) + if not self.dereference and statres.st_nlink > 1 and \ + inode in self.inodes and arcname != self.inodes[inode]: + # Is it a hardlink to an already + # archived file? + type = LNKTYPE + linkname = self.inodes[inode] + else: + # The inode is added only if its valid. + # For win32 it is always 0. + type = REGTYPE + if inode[0]: + self.inodes[inode] = arcname + elif stat.S_ISDIR(stmd): + type = DIRTYPE + elif stat.S_ISFIFO(stmd): + type = FIFOTYPE + elif stat.S_ISLNK(stmd): + type = SYMTYPE + linkname = os.readlink(name) + elif stat.S_ISCHR(stmd): + type = CHRTYPE + elif stat.S_ISBLK(stmd): + type = BLKTYPE + else: + return None + + # Fill the TarInfo object with all + # information we can get. + tarinfo.name = arcname + tarinfo.mode = stmd + tarinfo.uid = statres.st_uid + tarinfo.gid = statres.st_gid + if type == REGTYPE: + tarinfo.size = statres.st_size + else: + tarinfo.size = 0 + tarinfo.mtime = statres.st_mtime + tarinfo.type = type + tarinfo.linkname = linkname + if pwd: + try: + tarinfo.uname = pwd.getpwuid(tarinfo.uid)[0] + except KeyError: + pass + if grp: + try: + tarinfo.gname = grp.getgrgid(tarinfo.gid)[0] + except KeyError: + pass + + if type in (CHRTYPE, BLKTYPE): + if hasattr(os, "major") and hasattr(os, "minor"): + tarinfo.devmajor = os.major(statres.st_rdev) + tarinfo.devminor = os.minor(statres.st_rdev) + return tarinfo + + def list(self, verbose=True): + """Print a table of contents to sys.stdout. If `verbose' is False, only + the names of the members are printed. If it is True, an `ls -l'-like + output is produced. + """ + self._check() + + for tarinfo in self: + if verbose: + print(filemode(tarinfo.mode), end=' ') + print("%s/%s" % (tarinfo.uname or tarinfo.uid, + tarinfo.gname or tarinfo.gid), end=' ') + if tarinfo.ischr() or tarinfo.isblk(): + print("%10s" % ("%d,%d" \ + % (tarinfo.devmajor, tarinfo.devminor)), end=' ') + else: + print("%10d" % tarinfo.size, end=' ') + print("%d-%02d-%02d %02d:%02d:%02d" \ + % time.localtime(tarinfo.mtime)[:6], end=' ') + + print(tarinfo.name + ("/" if tarinfo.isdir() else ""), end=' ') + + if verbose: + if tarinfo.issym(): + print("->", tarinfo.linkname, end=' ') + if tarinfo.islnk(): + print("link to", tarinfo.linkname, end=' ') + print() + + def add(self, name, arcname=None, recursive=True, exclude=None, filter=None): + """Add the file `name' to the archive. `name' may be any type of file + (directory, fifo, symbolic link, etc.). If given, `arcname' + specifies an alternative name for the file in the archive. + Directories are added recursively by default. This can be avoided by + setting `recursive' to False. `exclude' is a function that should + return True for each filename to be excluded. `filter' is a function + that expects a TarInfo object argument and returns the changed + TarInfo object, if it returns None the TarInfo object will be + excluded from the archive. + """ + self._check("aw") + + if arcname is None: + arcname = name + + # Exclude pathnames. + if exclude is not None: + import warnings + warnings.warn("use the filter argument instead", + DeprecationWarning, 2) + if exclude(name): + self._dbg(2, "tarfile: Excluded %r" % name) + return + + # Skip if somebody tries to archive the archive... + if self.name is not None and os.path.abspath(name) == self.name: + self._dbg(2, "tarfile: Skipped %r" % name) + return + + self._dbg(1, name) + + # Create a TarInfo object from the file. + tarinfo = self.gettarinfo(name, arcname) + + if tarinfo is None: + self._dbg(1, "tarfile: Unsupported type %r" % name) + return + + # Change or exclude the TarInfo object. + if filter is not None: + tarinfo = filter(tarinfo) + if tarinfo is None: + self._dbg(2, "tarfile: Excluded %r" % name) + return + + # Append the tar header and data to the archive. + if tarinfo.isreg(): + f = bltn_open(name, "rb") + self.addfile(tarinfo, f) + f.close() + + elif tarinfo.isdir(): + self.addfile(tarinfo) + if recursive: + for f in os.listdir(name): + self.add(os.path.join(name, f), os.path.join(arcname, f), + recursive, exclude, filter=filter) + + else: + self.addfile(tarinfo) + + def addfile(self, tarinfo, fileobj=None): + """Add the TarInfo object `tarinfo' to the archive. If `fileobj' is + given, tarinfo.size bytes are read from it and added to the archive. + You can create TarInfo objects using gettarinfo(). + On Windows platforms, `fileobj' should always be opened with mode + 'rb' to avoid irritation about the file size. + """ + self._check("aw") + + tarinfo = copy.copy(tarinfo) + + buf = tarinfo.tobuf(self.format, self.encoding, self.errors) + self.fileobj.write(buf) + self.offset += len(buf) + + # If there's data to follow, append it. + if fileobj is not None: + copyfileobj(fileobj, self.fileobj, tarinfo.size) + blocks, remainder = divmod(tarinfo.size, BLOCKSIZE) + if remainder > 0: + self.fileobj.write(NUL * (BLOCKSIZE - remainder)) + blocks += 1 + self.offset += blocks * BLOCKSIZE + + self.members.append(tarinfo) + + def extractall(self, path=".", members=None): + """Extract all members from the archive to the current working + directory and set owner, modification time and permissions on + directories afterwards. `path' specifies a different directory + to extract to. `members' is optional and must be a subset of the + list returned by getmembers(). + """ + directories = [] + + if members is None: + members = self + + for tarinfo in members: + if tarinfo.isdir(): + # Extract directories with a safe mode. + directories.append(tarinfo) + tarinfo = copy.copy(tarinfo) + tarinfo.mode = 0o700 + # Do not set_attrs directories, as we will do that further down + self.extract(tarinfo, path, set_attrs=not tarinfo.isdir()) + + # Reverse sort directories. + directories.sort(key=lambda a: a.name) + directories.reverse() + + # Set correct owner, mtime and filemode on directories. + for tarinfo in directories: + dirpath = os.path.join(path, tarinfo.name) + try: + self.chown(tarinfo, dirpath) + self.utime(tarinfo, dirpath) + self.chmod(tarinfo, dirpath) + except ExtractError as e: + if self.errorlevel > 1: + raise + else: + self._dbg(1, "tarfile: %s" % e) + + def extract(self, member, path="", set_attrs=True): + """Extract a member from the archive to the current working directory, + using its full name. Its file information is extracted as accurately + as possible. `member' may be a filename or a TarInfo object. You can + specify a different directory using `path'. File attributes (owner, + mtime, mode) are set unless `set_attrs' is False. + """ + self._check("r") + + if isinstance(member, str): + tarinfo = self.getmember(member) + else: + tarinfo = member + + # Prepare the link target for makelink(). + if tarinfo.islnk(): + tarinfo._link_target = os.path.join(path, tarinfo.linkname) + + try: + self._extract_member(tarinfo, os.path.join(path, tarinfo.name), + set_attrs=set_attrs) + except EnvironmentError as e: + if self.errorlevel > 0: + raise + else: + if e.filename is None: + self._dbg(1, "tarfile: %s" % e.strerror) + else: + self._dbg(1, "tarfile: %s %r" % (e.strerror, e.filename)) + except ExtractError as e: + if self.errorlevel > 1: + raise + else: + self._dbg(1, "tarfile: %s" % e) + + def extractfile(self, member): + """Extract a member from the archive as a file object. `member' may be + a filename or a TarInfo object. If `member' is a regular file, a + file-like object is returned. If `member' is a link, a file-like + object is constructed from the link's target. If `member' is none of + the above, None is returned. + The file-like object is read-only and provides the following + methods: read(), readline(), readlines(), seek() and tell() + """ + self._check("r") + + if isinstance(member, str): + tarinfo = self.getmember(member) + else: + tarinfo = member + + if tarinfo.isreg(): + return self.fileobject(self, tarinfo) + + elif tarinfo.type not in SUPPORTED_TYPES: + # If a member's type is unknown, it is treated as a + # regular file. + return self.fileobject(self, tarinfo) + + elif tarinfo.islnk() or tarinfo.issym(): + if isinstance(self.fileobj, _Stream): + # A small but ugly workaround for the case that someone tries + # to extract a (sym)link as a file-object from a non-seekable + # stream of tar blocks. + raise StreamError("cannot extract (sym)link as file object") + else: + # A (sym)link's file object is its target's file object. + return self.extractfile(self._find_link_target(tarinfo)) + else: + # If there's no data associated with the member (directory, chrdev, + # blkdev, etc.), return None instead of a file object. + return None + + def _extract_member(self, tarinfo, targetpath, set_attrs=True): + """Extract the TarInfo object tarinfo to a physical + file called targetpath. + """ + # Fetch the TarInfo object for the given name + # and build the destination pathname, replacing + # forward slashes to platform specific separators. + targetpath = targetpath.rstrip("/") + targetpath = targetpath.replace("/", os.sep) + + # Create all upper directories. + upperdirs = os.path.dirname(targetpath) + if upperdirs and not os.path.exists(upperdirs): + # Create directories that are not part of the archive with + # default permissions. + os.makedirs(upperdirs) + + if tarinfo.islnk() or tarinfo.issym(): + self._dbg(1, "%s -> %s" % (tarinfo.name, tarinfo.linkname)) + else: + self._dbg(1, tarinfo.name) + + if tarinfo.isreg(): + self.makefile(tarinfo, targetpath) + elif tarinfo.isdir(): + self.makedir(tarinfo, targetpath) + elif tarinfo.isfifo(): + self.makefifo(tarinfo, targetpath) + elif tarinfo.ischr() or tarinfo.isblk(): + self.makedev(tarinfo, targetpath) + elif tarinfo.islnk() or tarinfo.issym(): + self.makelink(tarinfo, targetpath) + elif tarinfo.type not in SUPPORTED_TYPES: + self.makeunknown(tarinfo, targetpath) + else: + self.makefile(tarinfo, targetpath) + + if set_attrs: + self.chown(tarinfo, targetpath) + if not tarinfo.issym(): + self.chmod(tarinfo, targetpath) + self.utime(tarinfo, targetpath) + + #-------------------------------------------------------------------------- + # Below are the different file methods. They are called via + # _extract_member() when extract() is called. They can be replaced in a + # subclass to implement other functionality. + + def makedir(self, tarinfo, targetpath): + """Make a directory called targetpath. + """ + try: + # Use a safe mode for the directory, the real mode is set + # later in _extract_member(). + os.mkdir(targetpath, 0o700) + except EnvironmentError as e: + if e.errno != errno.EEXIST: + raise + + def makefile(self, tarinfo, targetpath): + """Make a file called targetpath. + """ + source = self.fileobj + source.seek(tarinfo.offset_data) + target = bltn_open(targetpath, "wb") + if tarinfo.sparse is not None: + for offset, size in tarinfo.sparse: + target.seek(offset) + copyfileobj(source, target, size) + else: + copyfileobj(source, target, tarinfo.size) + target.seek(tarinfo.size) + target.truncate() + target.close() + + def makeunknown(self, tarinfo, targetpath): + """Make a file from a TarInfo object with an unknown type + at targetpath. + """ + self.makefile(tarinfo, targetpath) + self._dbg(1, "tarfile: Unknown file type %r, " \ + "extracted as regular file." % tarinfo.type) + + def makefifo(self, tarinfo, targetpath): + """Make a fifo called targetpath. + """ + if hasattr(os, "mkfifo"): + os.mkfifo(targetpath) + else: + raise ExtractError("fifo not supported by system") + + def makedev(self, tarinfo, targetpath): + """Make a character or block device called targetpath. + """ + if not hasattr(os, "mknod") or not hasattr(os, "makedev"): + raise ExtractError("special devices not supported by system") + + mode = tarinfo.mode + if tarinfo.isblk(): + mode |= stat.S_IFBLK + else: + mode |= stat.S_IFCHR + + os.mknod(targetpath, mode, + os.makedev(tarinfo.devmajor, tarinfo.devminor)) + + def makelink(self, tarinfo, targetpath): + """Make a (symbolic) link called targetpath. If it cannot be created + (platform limitation), we try to make a copy of the referenced file + instead of a link. + """ + try: + # For systems that support symbolic and hard links. + if tarinfo.issym(): + os.symlink(tarinfo.linkname, targetpath) + else: + # See extract(). + if os.path.exists(tarinfo._link_target): + os.link(tarinfo._link_target, targetpath) + else: + self._extract_member(self._find_link_target(tarinfo), + targetpath) + except symlink_exception: + if tarinfo.issym(): + linkpath = os.path.join(os.path.dirname(tarinfo.name), + tarinfo.linkname) + else: + linkpath = tarinfo.linkname + else: + try: + self._extract_member(self._find_link_target(tarinfo), + targetpath) + except KeyError: + raise ExtractError("unable to resolve link inside archive") + + def chown(self, tarinfo, targetpath): + """Set owner of targetpath according to tarinfo. + """ + if pwd and hasattr(os, "geteuid") and os.geteuid() == 0: + # We have to be root to do so. + try: + g = grp.getgrnam(tarinfo.gname)[2] + except KeyError: + g = tarinfo.gid + try: + u = pwd.getpwnam(tarinfo.uname)[2] + except KeyError: + u = tarinfo.uid + try: + if tarinfo.issym() and hasattr(os, "lchown"): + os.lchown(targetpath, u, g) + else: + if sys.platform != "os2emx": + os.chown(targetpath, u, g) + except EnvironmentError as e: + raise ExtractError("could not change owner") + + def chmod(self, tarinfo, targetpath): + """Set file permissions of targetpath according to tarinfo. + """ + if hasattr(os, 'chmod'): + try: + os.chmod(targetpath, tarinfo.mode) + except EnvironmentError as e: + raise ExtractError("could not change mode") + + def utime(self, tarinfo, targetpath): + """Set modification time of targetpath according to tarinfo. + """ + if not hasattr(os, 'utime'): + return + try: + os.utime(targetpath, (tarinfo.mtime, tarinfo.mtime)) + except EnvironmentError as e: + raise ExtractError("could not change modification time") + + #-------------------------------------------------------------------------- + def next(self): + """Return the next member of the archive as a TarInfo object, when + TarFile is opened for reading. Return None if there is no more + available. + """ + self._check("ra") + if self.firstmember is not None: + m = self.firstmember + self.firstmember = None + return m + + # Read the next block. + self.fileobj.seek(self.offset) + tarinfo = None + while True: + try: + tarinfo = self.tarinfo.fromtarfile(self) + except EOFHeaderError as e: + if self.ignore_zeros: + self._dbg(2, "0x%X: %s" % (self.offset, e)) + self.offset += BLOCKSIZE + continue + except InvalidHeaderError as e: + if self.ignore_zeros: + self._dbg(2, "0x%X: %s" % (self.offset, e)) + self.offset += BLOCKSIZE + continue + elif self.offset == 0: + raise ReadError(str(e)) + except EmptyHeaderError: + if self.offset == 0: + raise ReadError("empty file") + except TruncatedHeaderError as e: + if self.offset == 0: + raise ReadError(str(e)) + except SubsequentHeaderError as e: + raise ReadError(str(e)) + break + + if tarinfo is not None: + self.members.append(tarinfo) + else: + self._loaded = True + + return tarinfo + + #-------------------------------------------------------------------------- + # Little helper methods: + + def _getmember(self, name, tarinfo=None, normalize=False): + """Find an archive member by name from bottom to top. + If tarinfo is given, it is used as the starting point. + """ + # Ensure that all members have been loaded. + members = self.getmembers() + + # Limit the member search list up to tarinfo. + if tarinfo is not None: + members = members[:members.index(tarinfo)] + + if normalize: + name = os.path.normpath(name) + + for member in reversed(members): + if normalize: + member_name = os.path.normpath(member.name) + else: + member_name = member.name + + if name == member_name: + return member + + def _load(self): + """Read through the entire archive file and look for readable + members. + """ + while True: + tarinfo = self.next() + if tarinfo is None: + break + self._loaded = True + + def _check(self, mode=None): + """Check if TarFile is still open, and if the operation's mode + corresponds to TarFile's mode. + """ + if self.closed: + raise IOError("%s is closed" % self.__class__.__name__) + if mode is not None and self.mode not in mode: + raise IOError("bad operation for mode %r" % self.mode) + + def _find_link_target(self, tarinfo): + """Find the target member of a symlink or hardlink member in the + archive. + """ + if tarinfo.issym(): + # Always search the entire archive. + linkname = os.path.dirname(tarinfo.name) + "/" + tarinfo.linkname + limit = None + else: + # Search the archive before the link, because a hard link is + # just a reference to an already archived file. + linkname = tarinfo.linkname + limit = tarinfo + + member = self._getmember(linkname, tarinfo=limit, normalize=True) + if member is None: + raise KeyError("linkname %r not found" % linkname) + return member + + def __iter__(self): + """Provide an iterator object. + """ + if self._loaded: + return iter(self.members) + else: + return TarIter(self) + + def _dbg(self, level, msg): + """Write debugging output to sys.stderr. + """ + if level <= self.debug: + print(msg, file=sys.stderr) + + def __enter__(self): + self._check() + return self + + def __exit__(self, type, value, traceback): + if type is None: + self.close() + else: + # An exception occurred. We must not call close() because + # it would try to write end-of-archive blocks and padding. + if not self._extfileobj: + self.fileobj.close() + self.closed = True +# class TarFile + +class TarIter(object): + """Iterator Class. + + for tarinfo in TarFile(...): + suite... + """ + + def __init__(self, tarfile): + """Construct a TarIter object. + """ + self.tarfile = tarfile + self.index = 0 + def __iter__(self): + """Return iterator object. + """ + return self + + def __next__(self): + """Return the next item using TarFile's next() method. + When all members have been read, set TarFile as _loaded. + """ + # Fix for SF #1100429: Under rare circumstances it can + # happen that getmembers() is called during iteration, + # which will cause TarIter to stop prematurely. + if not self.tarfile._loaded: + tarinfo = self.tarfile.next() + if not tarinfo: + self.tarfile._loaded = True + raise StopIteration + else: + try: + tarinfo = self.tarfile.members[self.index] + except IndexError: + raise StopIteration + self.index += 1 + return tarinfo + + next = __next__ # for Python 2.x + +#-------------------- +# exported functions +#-------------------- +def is_tarfile(name): + """Return True if name points to a tar archive that we + are able to handle, else return False. + """ + try: + t = open(name) + t.close() + return True + except TarError: + return False + +bltn_open = open +open = TarFile.open diff --git a/cres/venv/lib/python3.8/site-packages/distlib/compat.py b/cres/venv/lib/python3.8/site-packages/distlib/compat.py new file mode 100644 index 000000000..ff328c8ee --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/distlib/compat.py @@ -0,0 +1,1120 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2017 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from __future__ import absolute_import + +import os +import re +import sys + +try: + import ssl +except ImportError: # pragma: no cover + ssl = None + +if sys.version_info[0] < 3: # pragma: no cover + from StringIO import StringIO + string_types = basestring, + text_type = unicode + from types import FileType as file_type + import __builtin__ as builtins + import ConfigParser as configparser + from ._backport import shutil + from urlparse import urlparse, urlunparse, urljoin, urlsplit, urlunsplit + from urllib import (urlretrieve, quote as _quote, unquote, url2pathname, + pathname2url, ContentTooShortError, splittype) + + def quote(s): + if isinstance(s, unicode): + s = s.encode('utf-8') + return _quote(s) + + import urllib2 + from urllib2 import (Request, urlopen, URLError, HTTPError, + HTTPBasicAuthHandler, HTTPPasswordMgr, + HTTPHandler, HTTPRedirectHandler, + build_opener) + if ssl: + from urllib2 import HTTPSHandler + import httplib + import xmlrpclib + import Queue as queue + from HTMLParser import HTMLParser + import htmlentitydefs + raw_input = raw_input + from itertools import ifilter as filter + from itertools import ifilterfalse as filterfalse + + _userprog = None + def splituser(host): + """splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.""" + global _userprog + if _userprog is None: + import re + _userprog = re.compile('^(.*)@(.*)$') + + match = _userprog.match(host) + if match: return match.group(1, 2) + return None, host + +else: # pragma: no cover + from io import StringIO + string_types = str, + text_type = str + from io import TextIOWrapper as file_type + import builtins + import configparser + import shutil + from urllib.parse import (urlparse, urlunparse, urljoin, splituser, quote, + unquote, urlsplit, urlunsplit, splittype) + from urllib.request import (urlopen, urlretrieve, Request, url2pathname, + pathname2url, + HTTPBasicAuthHandler, HTTPPasswordMgr, + HTTPHandler, HTTPRedirectHandler, + build_opener) + if ssl: + from urllib.request import HTTPSHandler + from urllib.error import HTTPError, URLError, ContentTooShortError + import http.client as httplib + import urllib.request as urllib2 + import xmlrpc.client as xmlrpclib + import queue + from html.parser import HTMLParser + import html.entities as htmlentitydefs + raw_input = input + from itertools import filterfalse + filter = filter + +try: + from ssl import match_hostname, CertificateError +except ImportError: # pragma: no cover + class CertificateError(ValueError): + pass + + + def _dnsname_match(dn, hostname, max_wildcards=1): + """Matching according to RFC 6125, section 6.4.3 + + http://tools.ietf.org/html/rfc6125#section-6.4.3 + """ + pats = [] + if not dn: + return False + + parts = dn.split('.') + leftmost, remainder = parts[0], parts[1:] + + wildcards = leftmost.count('*') + if wildcards > max_wildcards: + # Issue #17980: avoid denials of service by refusing more + # than one wildcard per fragment. A survey of established + # policy among SSL implementations showed it to be a + # reasonable choice. + raise CertificateError( + "too many wildcards in certificate DNS name: " + repr(dn)) + + # speed up common case w/o wildcards + if not wildcards: + return dn.lower() == hostname.lower() + + # RFC 6125, section 6.4.3, subitem 1. + # The client SHOULD NOT attempt to match a presented identifier in which + # the wildcard character comprises a label other than the left-most label. + if leftmost == '*': + # When '*' is a fragment by itself, it matches a non-empty dotless + # fragment. + pats.append('[^.]+') + elif leftmost.startswith('xn--') or hostname.startswith('xn--'): + # RFC 6125, section 6.4.3, subitem 3. + # The client SHOULD NOT attempt to match a presented identifier + # where the wildcard character is embedded within an A-label or + # U-label of an internationalized domain name. + pats.append(re.escape(leftmost)) + else: + # Otherwise, '*' matches any dotless string, e.g. www* + pats.append(re.escape(leftmost).replace(r'\*', '[^.]*')) + + # add the remaining fragments, ignore any wildcards + for frag in remainder: + pats.append(re.escape(frag)) + + pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) + return pat.match(hostname) + + + def match_hostname(cert, hostname): + """Verify that *cert* (in decoded format as returned by + SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 + rules are followed, but IP addresses are not accepted for *hostname*. + + CertificateError is raised on failure. On success, the function + returns nothing. + """ + if not cert: + raise ValueError("empty or no certificate, match_hostname needs a " + "SSL socket or SSL context with either " + "CERT_OPTIONAL or CERT_REQUIRED") + dnsnames = [] + san = cert.get('subjectAltName', ()) + for key, value in san: + if key == 'DNS': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if not dnsnames: + # The subject is only checked when there is no dNSName entry + # in subjectAltName + for sub in cert.get('subject', ()): + for key, value in sub: + # XXX according to RFC 2818, the most specific Common Name + # must be used. + if key == 'commonName': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if len(dnsnames) > 1: + raise CertificateError("hostname %r " + "doesn't match either of %s" + % (hostname, ', '.join(map(repr, dnsnames)))) + elif len(dnsnames) == 1: + raise CertificateError("hostname %r " + "doesn't match %r" + % (hostname, dnsnames[0])) + else: + raise CertificateError("no appropriate commonName or " + "subjectAltName fields were found") + + +try: + from types import SimpleNamespace as Container +except ImportError: # pragma: no cover + class Container(object): + """ + A generic container for when multiple values need to be returned + """ + def __init__(self, **kwargs): + self.__dict__.update(kwargs) + + +try: + from shutil import which +except ImportError: # pragma: no cover + # Implementation from Python 3.3 + def which(cmd, mode=os.F_OK | os.X_OK, path=None): + """Given a command, mode, and a PATH string, return the path which + conforms to the given mode on the PATH, or None if there is no such + file. + + `mode` defaults to os.F_OK | os.X_OK. `path` defaults to the result + of os.environ.get("PATH"), or can be overridden with a custom search + path. + + """ + # Check that a given file can be accessed with the correct mode. + # Additionally check that `file` is not a directory, as on Windows + # directories pass the os.access check. + def _access_check(fn, mode): + return (os.path.exists(fn) and os.access(fn, mode) + and not os.path.isdir(fn)) + + # If we're given a path with a directory part, look it up directly rather + # than referring to PATH directories. This includes checking relative to the + # current directory, e.g. ./script + if os.path.dirname(cmd): + if _access_check(cmd, mode): + return cmd + return None + + if path is None: + path = os.environ.get("PATH", os.defpath) + if not path: + return None + path = path.split(os.pathsep) + + if sys.platform == "win32": + # The current directory takes precedence on Windows. + if not os.curdir in path: + path.insert(0, os.curdir) + + # PATHEXT is necessary to check on Windows. + pathext = os.environ.get("PATHEXT", "").split(os.pathsep) + # See if the given file matches any of the expected path extensions. + # This will allow us to short circuit when given "python.exe". + # If it does match, only test that one, otherwise we have to try + # others. + if any(cmd.lower().endswith(ext.lower()) for ext in pathext): + files = [cmd] + else: + files = [cmd + ext for ext in pathext] + else: + # On other platforms you don't have things like PATHEXT to tell you + # what file suffixes are executable, so just pass on cmd as-is. + files = [cmd] + + seen = set() + for dir in path: + normdir = os.path.normcase(dir) + if not normdir in seen: + seen.add(normdir) + for thefile in files: + name = os.path.join(dir, thefile) + if _access_check(name, mode): + return name + return None + + +# ZipFile is a context manager in 2.7, but not in 2.6 + +from zipfile import ZipFile as BaseZipFile + +if hasattr(BaseZipFile, '__enter__'): # pragma: no cover + ZipFile = BaseZipFile +else: # pragma: no cover + from zipfile import ZipExtFile as BaseZipExtFile + + class ZipExtFile(BaseZipExtFile): + def __init__(self, base): + self.__dict__.update(base.__dict__) + + def __enter__(self): + return self + + def __exit__(self, *exc_info): + self.close() + # return None, so if an exception occurred, it will propagate + + class ZipFile(BaseZipFile): + def __enter__(self): + return self + + def __exit__(self, *exc_info): + self.close() + # return None, so if an exception occurred, it will propagate + + def open(self, *args, **kwargs): + base = BaseZipFile.open(self, *args, **kwargs) + return ZipExtFile(base) + +try: + from platform import python_implementation +except ImportError: # pragma: no cover + def python_implementation(): + """Return a string identifying the Python implementation.""" + if 'PyPy' in sys.version: + return 'PyPy' + if os.name == 'java': + return 'Jython' + if sys.version.startswith('IronPython'): + return 'IronPython' + return 'CPython' + +try: + import sysconfig +except ImportError: # pragma: no cover + from ._backport import sysconfig + +try: + callable = callable +except NameError: # pragma: no cover + from collections import Callable + + def callable(obj): + return isinstance(obj, Callable) + + +try: + fsencode = os.fsencode + fsdecode = os.fsdecode +except AttributeError: # pragma: no cover + # Issue #99: on some systems (e.g. containerised), + # sys.getfilesystemencoding() returns None, and we need a real value, + # so fall back to utf-8. From the CPython 2.7 docs relating to Unix and + # sys.getfilesystemencoding(): the return value is "the user’s preference + # according to the result of nl_langinfo(CODESET), or None if the + # nl_langinfo(CODESET) failed." + _fsencoding = sys.getfilesystemencoding() or 'utf-8' + if _fsencoding == 'mbcs': + _fserrors = 'strict' + else: + _fserrors = 'surrogateescape' + + def fsencode(filename): + if isinstance(filename, bytes): + return filename + elif isinstance(filename, text_type): + return filename.encode(_fsencoding, _fserrors) + else: + raise TypeError("expect bytes or str, not %s" % + type(filename).__name__) + + def fsdecode(filename): + if isinstance(filename, text_type): + return filename + elif isinstance(filename, bytes): + return filename.decode(_fsencoding, _fserrors) + else: + raise TypeError("expect bytes or str, not %s" % + type(filename).__name__) + +try: + from tokenize import detect_encoding +except ImportError: # pragma: no cover + from codecs import BOM_UTF8, lookup + import re + + cookie_re = re.compile(r"coding[:=]\s*([-\w.]+)") + + def _get_normal_name(orig_enc): + """Imitates get_normal_name in tokenizer.c.""" + # Only care about the first 12 characters. + enc = orig_enc[:12].lower().replace("_", "-") + if enc == "utf-8" or enc.startswith("utf-8-"): + return "utf-8" + if enc in ("latin-1", "iso-8859-1", "iso-latin-1") or \ + enc.startswith(("latin-1-", "iso-8859-1-", "iso-latin-1-")): + return "iso-8859-1" + return orig_enc + + def detect_encoding(readline): + """ + The detect_encoding() function is used to detect the encoding that should + be used to decode a Python source file. It requires one argument, readline, + in the same way as the tokenize() generator. + + It will call readline a maximum of twice, and return the encoding used + (as a string) and a list of any lines (left as bytes) it has read in. + + It detects the encoding from the presence of a utf-8 bom or an encoding + cookie as specified in pep-0263. If both a bom and a cookie are present, + but disagree, a SyntaxError will be raised. If the encoding cookie is an + invalid charset, raise a SyntaxError. Note that if a utf-8 bom is found, + 'utf-8-sig' is returned. + + If no encoding is specified, then the default of 'utf-8' will be returned. + """ + try: + filename = readline.__self__.name + except AttributeError: + filename = None + bom_found = False + encoding = None + default = 'utf-8' + def read_or_stop(): + try: + return readline() + except StopIteration: + return b'' + + def find_cookie(line): + try: + # Decode as UTF-8. Either the line is an encoding declaration, + # in which case it should be pure ASCII, or it must be UTF-8 + # per default encoding. + line_string = line.decode('utf-8') + except UnicodeDecodeError: + msg = "invalid or missing encoding declaration" + if filename is not None: + msg = '{} for {!r}'.format(msg, filename) + raise SyntaxError(msg) + + matches = cookie_re.findall(line_string) + if not matches: + return None + encoding = _get_normal_name(matches[0]) + try: + codec = lookup(encoding) + except LookupError: + # This behaviour mimics the Python interpreter + if filename is None: + msg = "unknown encoding: " + encoding + else: + msg = "unknown encoding for {!r}: {}".format(filename, + encoding) + raise SyntaxError(msg) + + if bom_found: + if codec.name != 'utf-8': + # This behaviour mimics the Python interpreter + if filename is None: + msg = 'encoding problem: utf-8' + else: + msg = 'encoding problem for {!r}: utf-8'.format(filename) + raise SyntaxError(msg) + encoding += '-sig' + return encoding + + first = read_or_stop() + if first.startswith(BOM_UTF8): + bom_found = True + first = first[3:] + default = 'utf-8-sig' + if not first: + return default, [] + + encoding = find_cookie(first) + if encoding: + return encoding, [first] + + second = read_or_stop() + if not second: + return default, [first] + + encoding = find_cookie(second) + if encoding: + return encoding, [first, second] + + return default, [first, second] + +# For converting & <-> & etc. +try: + from html import escape +except ImportError: + from cgi import escape +if sys.version_info[:2] < (3, 4): + unescape = HTMLParser().unescape +else: + from html import unescape + +try: + from collections import ChainMap +except ImportError: # pragma: no cover + from collections import MutableMapping + + try: + from reprlib import recursive_repr as _recursive_repr + except ImportError: + def _recursive_repr(fillvalue='...'): + ''' + Decorator to make a repr function return fillvalue for a recursive + call + ''' + + def decorating_function(user_function): + repr_running = set() + + def wrapper(self): + key = id(self), get_ident() + if key in repr_running: + return fillvalue + repr_running.add(key) + try: + result = user_function(self) + finally: + repr_running.discard(key) + return result + + # Can't use functools.wraps() here because of bootstrap issues + wrapper.__module__ = getattr(user_function, '__module__') + wrapper.__doc__ = getattr(user_function, '__doc__') + wrapper.__name__ = getattr(user_function, '__name__') + wrapper.__annotations__ = getattr(user_function, '__annotations__', {}) + return wrapper + + return decorating_function + + class ChainMap(MutableMapping): + ''' A ChainMap groups multiple dicts (or other mappings) together + to create a single, updateable view. + + The underlying mappings are stored in a list. That list is public and can + accessed or updated using the *maps* attribute. There is no other state. + + Lookups search the underlying mappings successively until a key is found. + In contrast, writes, updates, and deletions only operate on the first + mapping. + + ''' + + def __init__(self, *maps): + '''Initialize a ChainMap by setting *maps* to the given mappings. + If no mappings are provided, a single empty dictionary is used. + + ''' + self.maps = list(maps) or [{}] # always at least one map + + def __missing__(self, key): + raise KeyError(key) + + def __getitem__(self, key): + for mapping in self.maps: + try: + return mapping[key] # can't use 'key in mapping' with defaultdict + except KeyError: + pass + return self.__missing__(key) # support subclasses that define __missing__ + + def get(self, key, default=None): + return self[key] if key in self else default + + def __len__(self): + return len(set().union(*self.maps)) # reuses stored hash values if possible + + def __iter__(self): + return iter(set().union(*self.maps)) + + def __contains__(self, key): + return any(key in m for m in self.maps) + + def __bool__(self): + return any(self.maps) + + @_recursive_repr() + def __repr__(self): + return '{0.__class__.__name__}({1})'.format( + self, ', '.join(map(repr, self.maps))) + + @classmethod + def fromkeys(cls, iterable, *args): + 'Create a ChainMap with a single dict created from the iterable.' + return cls(dict.fromkeys(iterable, *args)) + + def copy(self): + 'New ChainMap or subclass with a new copy of maps[0] and refs to maps[1:]' + return self.__class__(self.maps[0].copy(), *self.maps[1:]) + + __copy__ = copy + + def new_child(self): # like Django's Context.push() + 'New ChainMap with a new dict followed by all previous maps.' + return self.__class__({}, *self.maps) + + @property + def parents(self): # like Django's Context.pop() + 'New ChainMap from maps[1:].' + return self.__class__(*self.maps[1:]) + + def __setitem__(self, key, value): + self.maps[0][key] = value + + def __delitem__(self, key): + try: + del self.maps[0][key] + except KeyError: + raise KeyError('Key not found in the first mapping: {!r}'.format(key)) + + def popitem(self): + 'Remove and return an item pair from maps[0]. Raise KeyError is maps[0] is empty.' + try: + return self.maps[0].popitem() + except KeyError: + raise KeyError('No keys found in the first mapping.') + + def pop(self, key, *args): + 'Remove *key* from maps[0] and return its value. Raise KeyError if *key* not in maps[0].' + try: + return self.maps[0].pop(key, *args) + except KeyError: + raise KeyError('Key not found in the first mapping: {!r}'.format(key)) + + def clear(self): + 'Clear maps[0], leaving maps[1:] intact.' + self.maps[0].clear() + +try: + from importlib.util import cache_from_source # Python >= 3.4 +except ImportError: # pragma: no cover + try: + from imp import cache_from_source + except ImportError: # pragma: no cover + def cache_from_source(path, debug_override=None): + assert path.endswith('.py') + if debug_override is None: + debug_override = __debug__ + if debug_override: + suffix = 'c' + else: + suffix = 'o' + return path + suffix + +try: + from collections import OrderedDict +except ImportError: # pragma: no cover +## {{{ http://code.activestate.com/recipes/576693/ (r9) +# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy. +# Passes Python2.7's test suite and incorporates all the latest updates. + try: + from thread import get_ident as _get_ident + except ImportError: + from dummy_thread import get_ident as _get_ident + + try: + from _abcoll import KeysView, ValuesView, ItemsView + except ImportError: + pass + + + class OrderedDict(dict): + 'Dictionary that remembers insertion order' + # An inherited dict maps keys to values. + # The inherited dict provides __getitem__, __len__, __contains__, and get. + # The remaining methods are order-aware. + # Big-O running times for all methods are the same as for regular dictionaries. + + # The internal self.__map dictionary maps keys to links in a doubly linked list. + # The circular doubly linked list starts and ends with a sentinel element. + # The sentinel element never gets deleted (this simplifies the algorithm). + # Each link is stored as a list of length three: [PREV, NEXT, KEY]. + + def __init__(self, *args, **kwds): + '''Initialize an ordered dictionary. Signature is the same as for + regular dictionaries, but keyword arguments are not recommended + because their insertion order is arbitrary. + + ''' + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + try: + self.__root + except AttributeError: + self.__root = root = [] # sentinel node + root[:] = [root, root, None] + self.__map = {} + self.__update(*args, **kwds) + + def __setitem__(self, key, value, dict_setitem=dict.__setitem__): + 'od.__setitem__(i, y) <==> od[i]=y' + # Setting a new item creates a new link which goes at the end of the linked + # list, and the inherited dictionary is updated with the new key/value pair. + if key not in self: + root = self.__root + last = root[0] + last[1] = root[0] = self.__map[key] = [last, root, key] + dict_setitem(self, key, value) + + def __delitem__(self, key, dict_delitem=dict.__delitem__): + 'od.__delitem__(y) <==> del od[y]' + # Deleting an existing item uses self.__map to find the link which is + # then removed by updating the links in the predecessor and successor nodes. + dict_delitem(self, key) + link_prev, link_next, key = self.__map.pop(key) + link_prev[1] = link_next + link_next[0] = link_prev + + def __iter__(self): + 'od.__iter__() <==> iter(od)' + root = self.__root + curr = root[1] + while curr is not root: + yield curr[2] + curr = curr[1] + + def __reversed__(self): + 'od.__reversed__() <==> reversed(od)' + root = self.__root + curr = root[0] + while curr is not root: + yield curr[2] + curr = curr[0] + + def clear(self): + 'od.clear() -> None. Remove all items from od.' + try: + for node in self.__map.itervalues(): + del node[:] + root = self.__root + root[:] = [root, root, None] + self.__map.clear() + except AttributeError: + pass + dict.clear(self) + + def popitem(self, last=True): + '''od.popitem() -> (k, v), return and remove a (key, value) pair. + Pairs are returned in LIFO order if last is true or FIFO order if false. + + ''' + if not self: + raise KeyError('dictionary is empty') + root = self.__root + if last: + link = root[0] + link_prev = link[0] + link_prev[1] = root + root[0] = link_prev + else: + link = root[1] + link_next = link[1] + root[1] = link_next + link_next[0] = root + key = link[2] + del self.__map[key] + value = dict.pop(self, key) + return key, value + + # -- the following methods do not depend on the internal structure -- + + def keys(self): + 'od.keys() -> list of keys in od' + return list(self) + + def values(self): + 'od.values() -> list of values in od' + return [self[key] for key in self] + + def items(self): + 'od.items() -> list of (key, value) pairs in od' + return [(key, self[key]) for key in self] + + def iterkeys(self): + 'od.iterkeys() -> an iterator over the keys in od' + return iter(self) + + def itervalues(self): + 'od.itervalues -> an iterator over the values in od' + for k in self: + yield self[k] + + def iteritems(self): + 'od.iteritems -> an iterator over the (key, value) items in od' + for k in self: + yield (k, self[k]) + + def update(*args, **kwds): + '''od.update(E, **F) -> None. Update od from dict/iterable E and F. + + If E is a dict instance, does: for k in E: od[k] = E[k] + If E has a .keys() method, does: for k in E.keys(): od[k] = E[k] + Or if E is an iterable of items, does: for k, v in E: od[k] = v + In either case, this is followed by: for k, v in F.items(): od[k] = v + + ''' + if len(args) > 2: + raise TypeError('update() takes at most 2 positional ' + 'arguments (%d given)' % (len(args),)) + elif not args: + raise TypeError('update() takes at least 1 argument (0 given)') + self = args[0] + # Make progressively weaker assumptions about "other" + other = () + if len(args) == 2: + other = args[1] + if isinstance(other, dict): + for key in other: + self[key] = other[key] + elif hasattr(other, 'keys'): + for key in other.keys(): + self[key] = other[key] + else: + for key, value in other: + self[key] = value + for key, value in kwds.items(): + self[key] = value + + __update = update # let subclasses override update without breaking __init__ + + __marker = object() + + def pop(self, key, default=__marker): + '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value. + If key is not found, d is returned if given, otherwise KeyError is raised. + + ''' + if key in self: + result = self[key] + del self[key] + return result + if default is self.__marker: + raise KeyError(key) + return default + + def setdefault(self, key, default=None): + 'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od' + if key in self: + return self[key] + self[key] = default + return default + + def __repr__(self, _repr_running=None): + 'od.__repr__() <==> repr(od)' + if not _repr_running: _repr_running = {} + call_key = id(self), _get_ident() + if call_key in _repr_running: + return '...' + _repr_running[call_key] = 1 + try: + if not self: + return '%s()' % (self.__class__.__name__,) + return '%s(%r)' % (self.__class__.__name__, self.items()) + finally: + del _repr_running[call_key] + + def __reduce__(self): + 'Return state information for pickling' + items = [[k, self[k]] for k in self] + inst_dict = vars(self).copy() + for k in vars(OrderedDict()): + inst_dict.pop(k, None) + if inst_dict: + return (self.__class__, (items,), inst_dict) + return self.__class__, (items,) + + def copy(self): + 'od.copy() -> a shallow copy of od' + return self.__class__(self) + + @classmethod + def fromkeys(cls, iterable, value=None): + '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S + and values equal to v (which defaults to None). + + ''' + d = cls() + for key in iterable: + d[key] = value + return d + + def __eq__(self, other): + '''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive + while comparison to a regular mapping is order-insensitive. + + ''' + if isinstance(other, OrderedDict): + return len(self)==len(other) and self.items() == other.items() + return dict.__eq__(self, other) + + def __ne__(self, other): + return not self == other + + # -- the following methods are only used in Python 2.7 -- + + def viewkeys(self): + "od.viewkeys() -> a set-like object providing a view on od's keys" + return KeysView(self) + + def viewvalues(self): + "od.viewvalues() -> an object providing a view on od's values" + return ValuesView(self) + + def viewitems(self): + "od.viewitems() -> a set-like object providing a view on od's items" + return ItemsView(self) + +try: + from logging.config import BaseConfigurator, valid_ident +except ImportError: # pragma: no cover + IDENTIFIER = re.compile('^[a-z_][a-z0-9_]*$', re.I) + + + def valid_ident(s): + m = IDENTIFIER.match(s) + if not m: + raise ValueError('Not a valid Python identifier: %r' % s) + return True + + + # The ConvertingXXX classes are wrappers around standard Python containers, + # and they serve to convert any suitable values in the container. The + # conversion converts base dicts, lists and tuples to their wrapped + # equivalents, whereas strings which match a conversion format are converted + # appropriately. + # + # Each wrapper should have a configurator attribute holding the actual + # configurator to use for conversion. + + class ConvertingDict(dict): + """A converting dictionary wrapper.""" + + def __getitem__(self, key): + value = dict.__getitem__(self, key) + result = self.configurator.convert(value) + #If the converted value is different, save for next time + if value is not result: + self[key] = result + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + def get(self, key, default=None): + value = dict.get(self, key, default) + result = self.configurator.convert(value) + #If the converted value is different, save for next time + if value is not result: + self[key] = result + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + def pop(self, key, default=None): + value = dict.pop(self, key, default) + result = self.configurator.convert(value) + if value is not result: + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + class ConvertingList(list): + """A converting list wrapper.""" + def __getitem__(self, key): + value = list.__getitem__(self, key) + result = self.configurator.convert(value) + #If the converted value is different, save for next time + if value is not result: + self[key] = result + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + def pop(self, idx=-1): + value = list.pop(self, idx) + result = self.configurator.convert(value) + if value is not result: + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + return result + + class ConvertingTuple(tuple): + """A converting tuple wrapper.""" + def __getitem__(self, key): + value = tuple.__getitem__(self, key) + result = self.configurator.convert(value) + if value is not result: + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + class BaseConfigurator(object): + """ + The configurator base class which defines some useful defaults. + """ + + CONVERT_PATTERN = re.compile(r'^(?P[a-z]+)://(?P.*)$') + + WORD_PATTERN = re.compile(r'^\s*(\w+)\s*') + DOT_PATTERN = re.compile(r'^\.\s*(\w+)\s*') + INDEX_PATTERN = re.compile(r'^\[\s*(\w+)\s*\]\s*') + DIGIT_PATTERN = re.compile(r'^\d+$') + + value_converters = { + 'ext' : 'ext_convert', + 'cfg' : 'cfg_convert', + } + + # We might want to use a different one, e.g. importlib + importer = staticmethod(__import__) + + def __init__(self, config): + self.config = ConvertingDict(config) + self.config.configurator = self + + def resolve(self, s): + """ + Resolve strings to objects using standard import and attribute + syntax. + """ + name = s.split('.') + used = name.pop(0) + try: + found = self.importer(used) + for frag in name: + used += '.' + frag + try: + found = getattr(found, frag) + except AttributeError: + self.importer(used) + found = getattr(found, frag) + return found + except ImportError: + e, tb = sys.exc_info()[1:] + v = ValueError('Cannot resolve %r: %s' % (s, e)) + v.__cause__, v.__traceback__ = e, tb + raise v + + def ext_convert(self, value): + """Default converter for the ext:// protocol.""" + return self.resolve(value) + + def cfg_convert(self, value): + """Default converter for the cfg:// protocol.""" + rest = value + m = self.WORD_PATTERN.match(rest) + if m is None: + raise ValueError("Unable to convert %r" % value) + else: + rest = rest[m.end():] + d = self.config[m.groups()[0]] + #print d, rest + while rest: + m = self.DOT_PATTERN.match(rest) + if m: + d = d[m.groups()[0]] + else: + m = self.INDEX_PATTERN.match(rest) + if m: + idx = m.groups()[0] + if not self.DIGIT_PATTERN.match(idx): + d = d[idx] + else: + try: + n = int(idx) # try as number first (most likely) + d = d[n] + except TypeError: + d = d[idx] + if m: + rest = rest[m.end():] + else: + raise ValueError('Unable to convert ' + '%r at %r' % (value, rest)) + #rest should be empty + return d + + def convert(self, value): + """ + Convert values to an appropriate type. dicts, lists and tuples are + replaced by their converting alternatives. Strings are checked to + see if they have a conversion format and are converted if they do. + """ + if not isinstance(value, ConvertingDict) and isinstance(value, dict): + value = ConvertingDict(value) + value.configurator = self + elif not isinstance(value, ConvertingList) and isinstance(value, list): + value = ConvertingList(value) + value.configurator = self + elif not isinstance(value, ConvertingTuple) and\ + isinstance(value, tuple): + value = ConvertingTuple(value) + value.configurator = self + elif isinstance(value, string_types): + m = self.CONVERT_PATTERN.match(value) + if m: + d = m.groupdict() + prefix = d['prefix'] + converter = self.value_converters.get(prefix, None) + if converter: + suffix = d['suffix'] + converter = getattr(self, converter) + value = converter(suffix) + return value + + def configure_custom(self, config): + """Configure an object with a user-supplied factory.""" + c = config.pop('()') + if not callable(c): + c = self.resolve(c) + props = config.pop('.', None) + # Check for valid identifiers + kwargs = dict([(k, config[k]) for k in config if valid_ident(k)]) + result = c(**kwargs) + if props: + for name, value in props.items(): + setattr(result, name, value) + return result + + def as_tuple(self, value): + """Utility function which converts lists to tuples.""" + if isinstance(value, list): + value = tuple(value) + return value diff --git a/cres/venv/lib/python3.8/site-packages/distlib/database.py b/cres/venv/lib/python3.8/site-packages/distlib/database.py new file mode 100644 index 000000000..c16c0c8d9 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/distlib/database.py @@ -0,0 +1,1339 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2017 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""PEP 376 implementation.""" + +from __future__ import unicode_literals + +import base64 +import codecs +import contextlib +import hashlib +import logging +import os +import posixpath +import sys +import zipimport + +from . import DistlibException, resources +from .compat import StringIO +from .version import get_scheme, UnsupportedVersionError +from .metadata import (Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME, + LEGACY_METADATA_FILENAME) +from .util import (parse_requirement, cached_property, parse_name_and_version, + read_exports, write_exports, CSVReader, CSVWriter) + + +__all__ = ['Distribution', 'BaseInstalledDistribution', + 'InstalledDistribution', 'EggInfoDistribution', + 'DistributionPath'] + + +logger = logging.getLogger(__name__) + +EXPORTS_FILENAME = 'pydist-exports.json' +COMMANDS_FILENAME = 'pydist-commands.json' + +DIST_FILES = ('INSTALLER', METADATA_FILENAME, 'RECORD', 'REQUESTED', + 'RESOURCES', EXPORTS_FILENAME, 'SHARED') + +DISTINFO_EXT = '.dist-info' + + +class _Cache(object): + """ + A simple cache mapping names and .dist-info paths to distributions + """ + def __init__(self): + """ + Initialise an instance. There is normally one for each DistributionPath. + """ + self.name = {} + self.path = {} + self.generated = False + + def clear(self): + """ + Clear the cache, setting it to its initial state. + """ + self.name.clear() + self.path.clear() + self.generated = False + + def add(self, dist): + """ + Add a distribution to the cache. + :param dist: The distribution to add. + """ + if dist.path not in self.path: + self.path[dist.path] = dist + self.name.setdefault(dist.key, []).append(dist) + + +class DistributionPath(object): + """ + Represents a set of distributions installed on a path (typically sys.path). + """ + def __init__(self, path=None, include_egg=False): + """ + Create an instance from a path, optionally including legacy (distutils/ + setuptools/distribute) distributions. + :param path: The path to use, as a list of directories. If not specified, + sys.path is used. + :param include_egg: If True, this instance will look for and return legacy + distributions as well as those based on PEP 376. + """ + if path is None: + path = sys.path + self.path = path + self._include_dist = True + self._include_egg = include_egg + + self._cache = _Cache() + self._cache_egg = _Cache() + self._cache_enabled = True + self._scheme = get_scheme('default') + + def _get_cache_enabled(self): + return self._cache_enabled + + def _set_cache_enabled(self, value): + self._cache_enabled = value + + cache_enabled = property(_get_cache_enabled, _set_cache_enabled) + + def clear_cache(self): + """ + Clears the internal cache. + """ + self._cache.clear() + self._cache_egg.clear() + + + def _yield_distributions(self): + """ + Yield .dist-info and/or .egg(-info) distributions. + """ + # We need to check if we've seen some resources already, because on + # some Linux systems (e.g. some Debian/Ubuntu variants) there are + # symlinks which alias other files in the environment. + seen = set() + for path in self.path: + finder = resources.finder_for_path(path) + if finder is None: + continue + r = finder.find('') + if not r or not r.is_container: + continue + rset = sorted(r.resources) + for entry in rset: + r = finder.find(entry) + if not r or r.path in seen: + continue + if self._include_dist and entry.endswith(DISTINFO_EXT): + possible_filenames = [METADATA_FILENAME, + WHEEL_METADATA_FILENAME, + LEGACY_METADATA_FILENAME] + for metadata_filename in possible_filenames: + metadata_path = posixpath.join(entry, metadata_filename) + pydist = finder.find(metadata_path) + if pydist: + break + else: + continue + + with contextlib.closing(pydist.as_stream()) as stream: + metadata = Metadata(fileobj=stream, scheme='legacy') + logger.debug('Found %s', r.path) + seen.add(r.path) + yield new_dist_class(r.path, metadata=metadata, + env=self) + elif self._include_egg and entry.endswith(('.egg-info', + '.egg')): + logger.debug('Found %s', r.path) + seen.add(r.path) + yield old_dist_class(r.path, self) + + def _generate_cache(self): + """ + Scan the path for distributions and populate the cache with + those that are found. + """ + gen_dist = not self._cache.generated + gen_egg = self._include_egg and not self._cache_egg.generated + if gen_dist or gen_egg: + for dist in self._yield_distributions(): + if isinstance(dist, InstalledDistribution): + self._cache.add(dist) + else: + self._cache_egg.add(dist) + + if gen_dist: + self._cache.generated = True + if gen_egg: + self._cache_egg.generated = True + + @classmethod + def distinfo_dirname(cls, name, version): + """ + The *name* and *version* parameters are converted into their + filename-escaped form, i.e. any ``'-'`` characters are replaced + with ``'_'`` other than the one in ``'dist-info'`` and the one + separating the name from the version number. + + :parameter name: is converted to a standard distribution name by replacing + any runs of non- alphanumeric characters with a single + ``'-'``. + :type name: string + :parameter version: is converted to a standard version string. Spaces + become dots, and all other non-alphanumeric characters + (except dots) become dashes, with runs of multiple + dashes condensed to a single dash. + :type version: string + :returns: directory name + :rtype: string""" + name = name.replace('-', '_') + return '-'.join([name, version]) + DISTINFO_EXT + + def get_distributions(self): + """ + Provides an iterator that looks for distributions and returns + :class:`InstalledDistribution` or + :class:`EggInfoDistribution` instances for each one of them. + + :rtype: iterator of :class:`InstalledDistribution` and + :class:`EggInfoDistribution` instances + """ + if not self._cache_enabled: + for dist in self._yield_distributions(): + yield dist + else: + self._generate_cache() + + for dist in self._cache.path.values(): + yield dist + + if self._include_egg: + for dist in self._cache_egg.path.values(): + yield dist + + def get_distribution(self, name): + """ + Looks for a named distribution on the path. + + This function only returns the first result found, as no more than one + value is expected. If nothing is found, ``None`` is returned. + + :rtype: :class:`InstalledDistribution`, :class:`EggInfoDistribution` + or ``None`` + """ + result = None + name = name.lower() + if not self._cache_enabled: + for dist in self._yield_distributions(): + if dist.key == name: + result = dist + break + else: + self._generate_cache() + + if name in self._cache.name: + result = self._cache.name[name][0] + elif self._include_egg and name in self._cache_egg.name: + result = self._cache_egg.name[name][0] + return result + + def provides_distribution(self, name, version=None): + """ + Iterates over all distributions to find which distributions provide *name*. + If a *version* is provided, it will be used to filter the results. + + This function only returns the first result found, since no more than + one values are expected. If the directory is not found, returns ``None``. + + :parameter version: a version specifier that indicates the version + required, conforming to the format in ``PEP-345`` + + :type name: string + :type version: string + """ + matcher = None + if version is not None: + try: + matcher = self._scheme.matcher('%s (%s)' % (name, version)) + except ValueError: + raise DistlibException('invalid name or version: %r, %r' % + (name, version)) + + for dist in self.get_distributions(): + # We hit a problem on Travis where enum34 was installed and doesn't + # have a provides attribute ... + if not hasattr(dist, 'provides'): + logger.debug('No "provides": %s', dist) + else: + provided = dist.provides + + for p in provided: + p_name, p_ver = parse_name_and_version(p) + if matcher is None: + if p_name == name: + yield dist + break + else: + if p_name == name and matcher.match(p_ver): + yield dist + break + + def get_file_path(self, name, relative_path): + """ + Return the path to a resource file. + """ + dist = self.get_distribution(name) + if dist is None: + raise LookupError('no distribution named %r found' % name) + return dist.get_resource_path(relative_path) + + def get_exported_entries(self, category, name=None): + """ + Return all of the exported entries in a particular category. + + :param category: The category to search for entries. + :param name: If specified, only entries with that name are returned. + """ + for dist in self.get_distributions(): + r = dist.exports + if category in r: + d = r[category] + if name is not None: + if name in d: + yield d[name] + else: + for v in d.values(): + yield v + + +class Distribution(object): + """ + A base class for distributions, whether installed or from indexes. + Either way, it must have some metadata, so that's all that's needed + for construction. + """ + + build_time_dependency = False + """ + Set to True if it's known to be only a build-time dependency (i.e. + not needed after installation). + """ + + requested = False + """A boolean that indicates whether the ``REQUESTED`` metadata file is + present (in other words, whether the package was installed by user + request or it was installed as a dependency).""" + + def __init__(self, metadata): + """ + Initialise an instance. + :param metadata: The instance of :class:`Metadata` describing this + distribution. + """ + self.metadata = metadata + self.name = metadata.name + self.key = self.name.lower() # for case-insensitive comparisons + self.version = metadata.version + self.locator = None + self.digest = None + self.extras = None # additional features requested + self.context = None # environment marker overrides + self.download_urls = set() + self.digests = {} + + @property + def source_url(self): + """ + The source archive download URL for this distribution. + """ + return self.metadata.source_url + + download_url = source_url # Backward compatibility + + @property + def name_and_version(self): + """ + A utility property which displays the name and version in parentheses. + """ + return '%s (%s)' % (self.name, self.version) + + @property + def provides(self): + """ + A set of distribution names and versions provided by this distribution. + :return: A set of "name (version)" strings. + """ + plist = self.metadata.provides + s = '%s (%s)' % (self.name, self.version) + if s not in plist: + plist.append(s) + return plist + + def _get_requirements(self, req_attr): + md = self.metadata + logger.debug('Getting requirements from metadata %r', md.todict()) + reqts = getattr(md, req_attr) + return set(md.get_requirements(reqts, extras=self.extras, + env=self.context)) + + @property + def run_requires(self): + return self._get_requirements('run_requires') + + @property + def meta_requires(self): + return self._get_requirements('meta_requires') + + @property + def build_requires(self): + return self._get_requirements('build_requires') + + @property + def test_requires(self): + return self._get_requirements('test_requires') + + @property + def dev_requires(self): + return self._get_requirements('dev_requires') + + def matches_requirement(self, req): + """ + Say if this instance matches (fulfills) a requirement. + :param req: The requirement to match. + :rtype req: str + :return: True if it matches, else False. + """ + # Requirement may contain extras - parse to lose those + # from what's passed to the matcher + r = parse_requirement(req) + scheme = get_scheme(self.metadata.scheme) + try: + matcher = scheme.matcher(r.requirement) + except UnsupportedVersionError: + # XXX compat-mode if cannot read the version + logger.warning('could not read version %r - using name only', + req) + name = req.split()[0] + matcher = scheme.matcher(name) + + name = matcher.key # case-insensitive + + result = False + for p in self.provides: + p_name, p_ver = parse_name_and_version(p) + if p_name != name: + continue + try: + result = matcher.match(p_ver) + break + except UnsupportedVersionError: + pass + return result + + def __repr__(self): + """ + Return a textual representation of this instance, + """ + if self.source_url: + suffix = ' [%s]' % self.source_url + else: + suffix = '' + return '' % (self.name, self.version, suffix) + + def __eq__(self, other): + """ + See if this distribution is the same as another. + :param other: The distribution to compare with. To be equal to one + another. distributions must have the same type, name, + version and source_url. + :return: True if it is the same, else False. + """ + if type(other) is not type(self): + result = False + else: + result = (self.name == other.name and + self.version == other.version and + self.source_url == other.source_url) + return result + + def __hash__(self): + """ + Compute hash in a way which matches the equality test. + """ + return hash(self.name) + hash(self.version) + hash(self.source_url) + + +class BaseInstalledDistribution(Distribution): + """ + This is the base class for installed distributions (whether PEP 376 or + legacy). + """ + + hasher = None + + def __init__(self, metadata, path, env=None): + """ + Initialise an instance. + :param metadata: An instance of :class:`Metadata` which describes the + distribution. This will normally have been initialised + from a metadata file in the ``path``. + :param path: The path of the ``.dist-info`` or ``.egg-info`` + directory for the distribution. + :param env: This is normally the :class:`DistributionPath` + instance where this distribution was found. + """ + super(BaseInstalledDistribution, self).__init__(metadata) + self.path = path + self.dist_path = env + + def get_hash(self, data, hasher=None): + """ + Get the hash of some data, using a particular hash algorithm, if + specified. + + :param data: The data to be hashed. + :type data: bytes + :param hasher: The name of a hash implementation, supported by hashlib, + or ``None``. Examples of valid values are ``'sha1'``, + ``'sha224'``, ``'sha384'``, '``sha256'``, ``'md5'`` and + ``'sha512'``. If no hasher is specified, the ``hasher`` + attribute of the :class:`InstalledDistribution` instance + is used. If the hasher is determined to be ``None``, MD5 + is used as the hashing algorithm. + :returns: The hash of the data. If a hasher was explicitly specified, + the returned hash will be prefixed with the specified hasher + followed by '='. + :rtype: str + """ + if hasher is None: + hasher = self.hasher + if hasher is None: + hasher = hashlib.md5 + prefix = '' + else: + hasher = getattr(hashlib, hasher) + prefix = '%s=' % self.hasher + digest = hasher(data).digest() + digest = base64.urlsafe_b64encode(digest).rstrip(b'=').decode('ascii') + return '%s%s' % (prefix, digest) + + +class InstalledDistribution(BaseInstalledDistribution): + """ + Created with the *path* of the ``.dist-info`` directory provided to the + constructor. It reads the metadata contained in ``pydist.json`` when it is + instantiated., or uses a passed in Metadata instance (useful for when + dry-run mode is being used). + """ + + hasher = 'sha256' + + def __init__(self, path, metadata=None, env=None): + self.modules = [] + self.finder = finder = resources.finder_for_path(path) + if finder is None: + raise ValueError('finder unavailable for %s' % path) + if env and env._cache_enabled and path in env._cache.path: + metadata = env._cache.path[path].metadata + elif metadata is None: + r = finder.find(METADATA_FILENAME) + # Temporary - for Wheel 0.23 support + if r is None: + r = finder.find(WHEEL_METADATA_FILENAME) + # Temporary - for legacy support + if r is None: + r = finder.find('METADATA') + if r is None: + raise ValueError('no %s found in %s' % (METADATA_FILENAME, + path)) + with contextlib.closing(r.as_stream()) as stream: + metadata = Metadata(fileobj=stream, scheme='legacy') + + super(InstalledDistribution, self).__init__(metadata, path, env) + + if env and env._cache_enabled: + env._cache.add(self) + + r = finder.find('REQUESTED') + self.requested = r is not None + p = os.path.join(path, 'top_level.txt') + if os.path.exists(p): + with open(p, 'rb') as f: + data = f.read().decode('utf-8') + self.modules = data.splitlines() + + def __repr__(self): + return '' % ( + self.name, self.version, self.path) + + def __str__(self): + return "%s %s" % (self.name, self.version) + + def _get_records(self): + """ + Get the list of installed files for the distribution + :return: A list of tuples of path, hash and size. Note that hash and + size might be ``None`` for some entries. The path is exactly + as stored in the file (which is as in PEP 376). + """ + results = [] + r = self.get_distinfo_resource('RECORD') + with contextlib.closing(r.as_stream()) as stream: + with CSVReader(stream=stream) as record_reader: + # Base location is parent dir of .dist-info dir + #base_location = os.path.dirname(self.path) + #base_location = os.path.abspath(base_location) + for row in record_reader: + missing = [None for i in range(len(row), 3)] + path, checksum, size = row + missing + #if not os.path.isabs(path): + # path = path.replace('/', os.sep) + # path = os.path.join(base_location, path) + results.append((path, checksum, size)) + return results + + @cached_property + def exports(self): + """ + Return the information exported by this distribution. + :return: A dictionary of exports, mapping an export category to a dict + of :class:`ExportEntry` instances describing the individual + export entries, and keyed by name. + """ + result = {} + r = self.get_distinfo_resource(EXPORTS_FILENAME) + if r: + result = self.read_exports() + return result + + def read_exports(self): + """ + Read exports data from a file in .ini format. + + :return: A dictionary of exports, mapping an export category to a list + of :class:`ExportEntry` instances describing the individual + export entries. + """ + result = {} + r = self.get_distinfo_resource(EXPORTS_FILENAME) + if r: + with contextlib.closing(r.as_stream()) as stream: + result = read_exports(stream) + return result + + def write_exports(self, exports): + """ + Write a dictionary of exports to a file in .ini format. + :param exports: A dictionary of exports, mapping an export category to + a list of :class:`ExportEntry` instances describing the + individual export entries. + """ + rf = self.get_distinfo_file(EXPORTS_FILENAME) + with open(rf, 'w') as f: + write_exports(exports, f) + + def get_resource_path(self, relative_path): + """ + NOTE: This API may change in the future. + + Return the absolute path to a resource file with the given relative + path. + + :param relative_path: The path, relative to .dist-info, of the resource + of interest. + :return: The absolute path where the resource is to be found. + """ + r = self.get_distinfo_resource('RESOURCES') + with contextlib.closing(r.as_stream()) as stream: + with CSVReader(stream=stream) as resources_reader: + for relative, destination in resources_reader: + if relative == relative_path: + return destination + raise KeyError('no resource file with relative path %r ' + 'is installed' % relative_path) + + def list_installed_files(self): + """ + Iterates over the ``RECORD`` entries and returns a tuple + ``(path, hash, size)`` for each line. + + :returns: iterator of (path, hash, size) + """ + for result in self._get_records(): + yield result + + def write_installed_files(self, paths, prefix, dry_run=False): + """ + Writes the ``RECORD`` file, using the ``paths`` iterable passed in. Any + existing ``RECORD`` file is silently overwritten. + + prefix is used to determine when to write absolute paths. + """ + prefix = os.path.join(prefix, '') + base = os.path.dirname(self.path) + base_under_prefix = base.startswith(prefix) + base = os.path.join(base, '') + record_path = self.get_distinfo_file('RECORD') + logger.info('creating %s', record_path) + if dry_run: + return None + with CSVWriter(record_path) as writer: + for path in paths: + if os.path.isdir(path) or path.endswith(('.pyc', '.pyo')): + # do not put size and hash, as in PEP-376 + hash_value = size = '' + else: + size = '%d' % os.path.getsize(path) + with open(path, 'rb') as fp: + hash_value = self.get_hash(fp.read()) + if path.startswith(base) or (base_under_prefix and + path.startswith(prefix)): + path = os.path.relpath(path, base) + writer.writerow((path, hash_value, size)) + + # add the RECORD file itself + if record_path.startswith(base): + record_path = os.path.relpath(record_path, base) + writer.writerow((record_path, '', '')) + return record_path + + def check_installed_files(self): + """ + Checks that the hashes and sizes of the files in ``RECORD`` are + matched by the files themselves. Returns a (possibly empty) list of + mismatches. Each entry in the mismatch list will be a tuple consisting + of the path, 'exists', 'size' or 'hash' according to what didn't match + (existence is checked first, then size, then hash), the expected + value and the actual value. + """ + mismatches = [] + base = os.path.dirname(self.path) + record_path = self.get_distinfo_file('RECORD') + for path, hash_value, size in self.list_installed_files(): + if not os.path.isabs(path): + path = os.path.join(base, path) + if path == record_path: + continue + if not os.path.exists(path): + mismatches.append((path, 'exists', True, False)) + elif os.path.isfile(path): + actual_size = str(os.path.getsize(path)) + if size and actual_size != size: + mismatches.append((path, 'size', size, actual_size)) + elif hash_value: + if '=' in hash_value: + hasher = hash_value.split('=', 1)[0] + else: + hasher = None + + with open(path, 'rb') as f: + actual_hash = self.get_hash(f.read(), hasher) + if actual_hash != hash_value: + mismatches.append((path, 'hash', hash_value, actual_hash)) + return mismatches + + @cached_property + def shared_locations(self): + """ + A dictionary of shared locations whose keys are in the set 'prefix', + 'purelib', 'platlib', 'scripts', 'headers', 'data' and 'namespace'. + The corresponding value is the absolute path of that category for + this distribution, and takes into account any paths selected by the + user at installation time (e.g. via command-line arguments). In the + case of the 'namespace' key, this would be a list of absolute paths + for the roots of namespace packages in this distribution. + + The first time this property is accessed, the relevant information is + read from the SHARED file in the .dist-info directory. + """ + result = {} + shared_path = os.path.join(self.path, 'SHARED') + if os.path.isfile(shared_path): + with codecs.open(shared_path, 'r', encoding='utf-8') as f: + lines = f.read().splitlines() + for line in lines: + key, value = line.split('=', 1) + if key == 'namespace': + result.setdefault(key, []).append(value) + else: + result[key] = value + return result + + def write_shared_locations(self, paths, dry_run=False): + """ + Write shared location information to the SHARED file in .dist-info. + :param paths: A dictionary as described in the documentation for + :meth:`shared_locations`. + :param dry_run: If True, the action is logged but no file is actually + written. + :return: The path of the file written to. + """ + shared_path = os.path.join(self.path, 'SHARED') + logger.info('creating %s', shared_path) + if dry_run: + return None + lines = [] + for key in ('prefix', 'lib', 'headers', 'scripts', 'data'): + path = paths[key] + if os.path.isdir(paths[key]): + lines.append('%s=%s' % (key, path)) + for ns in paths.get('namespace', ()): + lines.append('namespace=%s' % ns) + + with codecs.open(shared_path, 'w', encoding='utf-8') as f: + f.write('\n'.join(lines)) + return shared_path + + def get_distinfo_resource(self, path): + if path not in DIST_FILES: + raise DistlibException('invalid path for a dist-info file: ' + '%r at %r' % (path, self.path)) + finder = resources.finder_for_path(self.path) + if finder is None: + raise DistlibException('Unable to get a finder for %s' % self.path) + return finder.find(path) + + def get_distinfo_file(self, path): + """ + Returns a path located under the ``.dist-info`` directory. Returns a + string representing the path. + + :parameter path: a ``'/'``-separated path relative to the + ``.dist-info`` directory or an absolute path; + If *path* is an absolute path and doesn't start + with the ``.dist-info`` directory path, + a :class:`DistlibException` is raised + :type path: str + :rtype: str + """ + # Check if it is an absolute path # XXX use relpath, add tests + if path.find(os.sep) >= 0: + # it's an absolute path? + distinfo_dirname, path = path.split(os.sep)[-2:] + if distinfo_dirname != self.path.split(os.sep)[-1]: + raise DistlibException( + 'dist-info file %r does not belong to the %r %s ' + 'distribution' % (path, self.name, self.version)) + + # The file must be relative + if path not in DIST_FILES: + raise DistlibException('invalid path for a dist-info file: ' + '%r at %r' % (path, self.path)) + + return os.path.join(self.path, path) + + def list_distinfo_files(self): + """ + Iterates over the ``RECORD`` entries and returns paths for each line if + the path is pointing to a file located in the ``.dist-info`` directory + or one of its subdirectories. + + :returns: iterator of paths + """ + base = os.path.dirname(self.path) + for path, checksum, size in self._get_records(): + # XXX add separator or use real relpath algo + if not os.path.isabs(path): + path = os.path.join(base, path) + if path.startswith(self.path): + yield path + + def __eq__(self, other): + return (isinstance(other, InstalledDistribution) and + self.path == other.path) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + __hash__ = object.__hash__ + + +class EggInfoDistribution(BaseInstalledDistribution): + """Created with the *path* of the ``.egg-info`` directory or file provided + to the constructor. It reads the metadata contained in the file itself, or + if the given path happens to be a directory, the metadata is read from the + file ``PKG-INFO`` under that directory.""" + + requested = True # as we have no way of knowing, assume it was + shared_locations = {} + + def __init__(self, path, env=None): + def set_name_and_version(s, n, v): + s.name = n + s.key = n.lower() # for case-insensitive comparisons + s.version = v + + self.path = path + self.dist_path = env + if env and env._cache_enabled and path in env._cache_egg.path: + metadata = env._cache_egg.path[path].metadata + set_name_and_version(self, metadata.name, metadata.version) + else: + metadata = self._get_metadata(path) + + # Need to be set before caching + set_name_and_version(self, metadata.name, metadata.version) + + if env and env._cache_enabled: + env._cache_egg.add(self) + super(EggInfoDistribution, self).__init__(metadata, path, env) + + def _get_metadata(self, path): + requires = None + + def parse_requires_data(data): + """Create a list of dependencies from a requires.txt file. + + *data*: the contents of a setuptools-produced requires.txt file. + """ + reqs = [] + lines = data.splitlines() + for line in lines: + line = line.strip() + if line.startswith('['): + logger.warning('Unexpected line: quitting requirement scan: %r', + line) + break + r = parse_requirement(line) + if not r: + logger.warning('Not recognised as a requirement: %r', line) + continue + if r.extras: + logger.warning('extra requirements in requires.txt are ' + 'not supported') + if not r.constraints: + reqs.append(r.name) + else: + cons = ', '.join('%s%s' % c for c in r.constraints) + reqs.append('%s (%s)' % (r.name, cons)) + return reqs + + def parse_requires_path(req_path): + """Create a list of dependencies from a requires.txt file. + + *req_path*: the path to a setuptools-produced requires.txt file. + """ + + reqs = [] + try: + with codecs.open(req_path, 'r', 'utf-8') as fp: + reqs = parse_requires_data(fp.read()) + except IOError: + pass + return reqs + + tl_path = tl_data = None + if path.endswith('.egg'): + if os.path.isdir(path): + p = os.path.join(path, 'EGG-INFO') + meta_path = os.path.join(p, 'PKG-INFO') + metadata = Metadata(path=meta_path, scheme='legacy') + req_path = os.path.join(p, 'requires.txt') + tl_path = os.path.join(p, 'top_level.txt') + requires = parse_requires_path(req_path) + else: + # FIXME handle the case where zipfile is not available + zipf = zipimport.zipimporter(path) + fileobj = StringIO( + zipf.get_data('EGG-INFO/PKG-INFO').decode('utf8')) + metadata = Metadata(fileobj=fileobj, scheme='legacy') + try: + data = zipf.get_data('EGG-INFO/requires.txt') + tl_data = zipf.get_data('EGG-INFO/top_level.txt').decode('utf-8') + requires = parse_requires_data(data.decode('utf-8')) + except IOError: + requires = None + elif path.endswith('.egg-info'): + if os.path.isdir(path): + req_path = os.path.join(path, 'requires.txt') + requires = parse_requires_path(req_path) + path = os.path.join(path, 'PKG-INFO') + tl_path = os.path.join(path, 'top_level.txt') + metadata = Metadata(path=path, scheme='legacy') + else: + raise DistlibException('path must end with .egg-info or .egg, ' + 'got %r' % path) + + if requires: + metadata.add_requirements(requires) + # look for top-level modules in top_level.txt, if present + if tl_data is None: + if tl_path is not None and os.path.exists(tl_path): + with open(tl_path, 'rb') as f: + tl_data = f.read().decode('utf-8') + if not tl_data: + tl_data = [] + else: + tl_data = tl_data.splitlines() + self.modules = tl_data + return metadata + + def __repr__(self): + return '' % ( + self.name, self.version, self.path) + + def __str__(self): + return "%s %s" % (self.name, self.version) + + def check_installed_files(self): + """ + Checks that the hashes and sizes of the files in ``RECORD`` are + matched by the files themselves. Returns a (possibly empty) list of + mismatches. Each entry in the mismatch list will be a tuple consisting + of the path, 'exists', 'size' or 'hash' according to what didn't match + (existence is checked first, then size, then hash), the expected + value and the actual value. + """ + mismatches = [] + record_path = os.path.join(self.path, 'installed-files.txt') + if os.path.exists(record_path): + for path, _, _ in self.list_installed_files(): + if path == record_path: + continue + if not os.path.exists(path): + mismatches.append((path, 'exists', True, False)) + return mismatches + + def list_installed_files(self): + """ + Iterates over the ``installed-files.txt`` entries and returns a tuple + ``(path, hash, size)`` for each line. + + :returns: a list of (path, hash, size) + """ + + def _md5(path): + f = open(path, 'rb') + try: + content = f.read() + finally: + f.close() + return hashlib.md5(content).hexdigest() + + def _size(path): + return os.stat(path).st_size + + record_path = os.path.join(self.path, 'installed-files.txt') + result = [] + if os.path.exists(record_path): + with codecs.open(record_path, 'r', encoding='utf-8') as f: + for line in f: + line = line.strip() + p = os.path.normpath(os.path.join(self.path, line)) + # "./" is present as a marker between installed files + # and installation metadata files + if not os.path.exists(p): + logger.warning('Non-existent file: %s', p) + if p.endswith(('.pyc', '.pyo')): + continue + #otherwise fall through and fail + if not os.path.isdir(p): + result.append((p, _md5(p), _size(p))) + result.append((record_path, None, None)) + return result + + def list_distinfo_files(self, absolute=False): + """ + Iterates over the ``installed-files.txt`` entries and returns paths for + each line if the path is pointing to a file located in the + ``.egg-info`` directory or one of its subdirectories. + + :parameter absolute: If *absolute* is ``True``, each returned path is + transformed into a local absolute path. Otherwise the + raw value from ``installed-files.txt`` is returned. + :type absolute: boolean + :returns: iterator of paths + """ + record_path = os.path.join(self.path, 'installed-files.txt') + if os.path.exists(record_path): + skip = True + with codecs.open(record_path, 'r', encoding='utf-8') as f: + for line in f: + line = line.strip() + if line == './': + skip = False + continue + if not skip: + p = os.path.normpath(os.path.join(self.path, line)) + if p.startswith(self.path): + if absolute: + yield p + else: + yield line + + def __eq__(self, other): + return (isinstance(other, EggInfoDistribution) and + self.path == other.path) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + __hash__ = object.__hash__ + +new_dist_class = InstalledDistribution +old_dist_class = EggInfoDistribution + + +class DependencyGraph(object): + """ + Represents a dependency graph between distributions. + + The dependency relationships are stored in an ``adjacency_list`` that maps + distributions to a list of ``(other, label)`` tuples where ``other`` + is a distribution and the edge is labeled with ``label`` (i.e. the version + specifier, if such was provided). Also, for more efficient traversal, for + every distribution ``x``, a list of predecessors is kept in + ``reverse_list[x]``. An edge from distribution ``a`` to + distribution ``b`` means that ``a`` depends on ``b``. If any missing + dependencies are found, they are stored in ``missing``, which is a + dictionary that maps distributions to a list of requirements that were not + provided by any other distributions. + """ + + def __init__(self): + self.adjacency_list = {} + self.reverse_list = {} + self.missing = {} + + def add_distribution(self, distribution): + """Add the *distribution* to the graph. + + :type distribution: :class:`distutils2.database.InstalledDistribution` + or :class:`distutils2.database.EggInfoDistribution` + """ + self.adjacency_list[distribution] = [] + self.reverse_list[distribution] = [] + #self.missing[distribution] = [] + + def add_edge(self, x, y, label=None): + """Add an edge from distribution *x* to distribution *y* with the given + *label*. + + :type x: :class:`distutils2.database.InstalledDistribution` or + :class:`distutils2.database.EggInfoDistribution` + :type y: :class:`distutils2.database.InstalledDistribution` or + :class:`distutils2.database.EggInfoDistribution` + :type label: ``str`` or ``None`` + """ + self.adjacency_list[x].append((y, label)) + # multiple edges are allowed, so be careful + if x not in self.reverse_list[y]: + self.reverse_list[y].append(x) + + def add_missing(self, distribution, requirement): + """ + Add a missing *requirement* for the given *distribution*. + + :type distribution: :class:`distutils2.database.InstalledDistribution` + or :class:`distutils2.database.EggInfoDistribution` + :type requirement: ``str`` + """ + logger.debug('%s missing %r', distribution, requirement) + self.missing.setdefault(distribution, []).append(requirement) + + def _repr_dist(self, dist): + return '%s %s' % (dist.name, dist.version) + + def repr_node(self, dist, level=1): + """Prints only a subgraph""" + output = [self._repr_dist(dist)] + for other, label in self.adjacency_list[dist]: + dist = self._repr_dist(other) + if label is not None: + dist = '%s [%s]' % (dist, label) + output.append(' ' * level + str(dist)) + suboutput = self.repr_node(other, level + 1) + subs = suboutput.split('\n') + output.extend(subs[1:]) + return '\n'.join(output) + + def to_dot(self, f, skip_disconnected=True): + """Writes a DOT output for the graph to the provided file *f*. + + If *skip_disconnected* is set to ``True``, then all distributions + that are not dependent on any other distribution are skipped. + + :type f: has to support ``file``-like operations + :type skip_disconnected: ``bool`` + """ + disconnected = [] + + f.write("digraph dependencies {\n") + for dist, adjs in self.adjacency_list.items(): + if len(adjs) == 0 and not skip_disconnected: + disconnected.append(dist) + for other, label in adjs: + if not label is None: + f.write('"%s" -> "%s" [label="%s"]\n' % + (dist.name, other.name, label)) + else: + f.write('"%s" -> "%s"\n' % (dist.name, other.name)) + if not skip_disconnected and len(disconnected) > 0: + f.write('subgraph disconnected {\n') + f.write('label = "Disconnected"\n') + f.write('bgcolor = red\n') + + for dist in disconnected: + f.write('"%s"' % dist.name) + f.write('\n') + f.write('}\n') + f.write('}\n') + + def topological_sort(self): + """ + Perform a topological sort of the graph. + :return: A tuple, the first element of which is a topologically sorted + list of distributions, and the second element of which is a + list of distributions that cannot be sorted because they have + circular dependencies and so form a cycle. + """ + result = [] + # Make a shallow copy of the adjacency list + alist = {} + for k, v in self.adjacency_list.items(): + alist[k] = v[:] + while True: + # See what we can remove in this run + to_remove = [] + for k, v in list(alist.items())[:]: + if not v: + to_remove.append(k) + del alist[k] + if not to_remove: + # What's left in alist (if anything) is a cycle. + break + # Remove from the adjacency list of others + for k, v in alist.items(): + alist[k] = [(d, r) for d, r in v if d not in to_remove] + logger.debug('Moving to result: %s', + ['%s (%s)' % (d.name, d.version) for d in to_remove]) + result.extend(to_remove) + return result, list(alist.keys()) + + def __repr__(self): + """Representation of the graph""" + output = [] + for dist, adjs in self.adjacency_list.items(): + output.append(self.repr_node(dist)) + return '\n'.join(output) + + +def make_graph(dists, scheme='default'): + """Makes a dependency graph from the given distributions. + + :parameter dists: a list of distributions + :type dists: list of :class:`distutils2.database.InstalledDistribution` and + :class:`distutils2.database.EggInfoDistribution` instances + :rtype: a :class:`DependencyGraph` instance + """ + scheme = get_scheme(scheme) + graph = DependencyGraph() + provided = {} # maps names to lists of (version, dist) tuples + + # first, build the graph and find out what's provided + for dist in dists: + graph.add_distribution(dist) + + for p in dist.provides: + name, version = parse_name_and_version(p) + logger.debug('Add to provided: %s, %s, %s', name, version, dist) + provided.setdefault(name, []).append((version, dist)) + + # now make the edges + for dist in dists: + requires = (dist.run_requires | dist.meta_requires | + dist.build_requires | dist.dev_requires) + for req in requires: + try: + matcher = scheme.matcher(req) + except UnsupportedVersionError: + # XXX compat-mode if cannot read the version + logger.warning('could not read version %r - using name only', + req) + name = req.split()[0] + matcher = scheme.matcher(name) + + name = matcher.key # case-insensitive + + matched = False + if name in provided: + for version, provider in provided[name]: + try: + match = matcher.match(version) + except UnsupportedVersionError: + match = False + + if match: + graph.add_edge(dist, provider, req) + matched = True + break + if not matched: + graph.add_missing(dist, req) + return graph + + +def get_dependent_dists(dists, dist): + """Recursively generate a list of distributions from *dists* that are + dependent on *dist*. + + :param dists: a list of distributions + :param dist: a distribution, member of *dists* for which we are interested + """ + if dist not in dists: + raise DistlibException('given distribution %r is not a member ' + 'of the list' % dist.name) + graph = make_graph(dists) + + dep = [dist] # dependent distributions + todo = graph.reverse_list[dist] # list of nodes we should inspect + + while todo: + d = todo.pop() + dep.append(d) + for succ in graph.reverse_list[d]: + if succ not in dep: + todo.append(succ) + + dep.pop(0) # remove dist from dep, was there to prevent infinite loops + return dep + + +def get_required_dists(dists, dist): + """Recursively generate a list of distributions from *dists* that are + required by *dist*. + + :param dists: a list of distributions + :param dist: a distribution, member of *dists* for which we are interested + """ + if dist not in dists: + raise DistlibException('given distribution %r is not a member ' + 'of the list' % dist.name) + graph = make_graph(dists) + + req = [] # required distributions + todo = graph.adjacency_list[dist] # list of nodes we should inspect + + while todo: + d = todo.pop()[0] + req.append(d) + for pred in graph.adjacency_list[d]: + if pred not in req: + todo.append(pred) + + return req + + +def make_dist(name, version, **kwargs): + """ + A convenience method for making a dist given just a name and version. + """ + summary = kwargs.pop('summary', 'Placeholder for summary') + md = Metadata(**kwargs) + md.name = name + md.version = version + md.summary = summary or 'Placeholder for summary' + return Distribution(md) diff --git a/cres/venv/lib/python3.8/site-packages/distlib/index.py b/cres/venv/lib/python3.8/site-packages/distlib/index.py new file mode 100644 index 000000000..7a87cdcf7 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/distlib/index.py @@ -0,0 +1,516 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +import hashlib +import logging +import os +import shutil +import subprocess +import tempfile +try: + from threading import Thread +except ImportError: + from dummy_threading import Thread + +from . import DistlibException +from .compat import (HTTPBasicAuthHandler, Request, HTTPPasswordMgr, + urlparse, build_opener, string_types) +from .util import cached_property, zip_dir, ServerProxy + +logger = logging.getLogger(__name__) + +DEFAULT_INDEX = 'https://pypi.org/pypi' +DEFAULT_REALM = 'pypi' + +class PackageIndex(object): + """ + This class represents a package index compatible with PyPI, the Python + Package Index. + """ + + boundary = b'----------ThIs_Is_tHe_distlib_index_bouNdaRY_$' + + def __init__(self, url=None): + """ + Initialise an instance. + + :param url: The URL of the index. If not specified, the URL for PyPI is + used. + """ + self.url = url or DEFAULT_INDEX + self.read_configuration() + scheme, netloc, path, params, query, frag = urlparse(self.url) + if params or query or frag or scheme not in ('http', 'https'): + raise DistlibException('invalid repository: %s' % self.url) + self.password_handler = None + self.ssl_verifier = None + self.gpg = None + self.gpg_home = None + with open(os.devnull, 'w') as sink: + # Use gpg by default rather than gpg2, as gpg2 insists on + # prompting for passwords + for s in ('gpg', 'gpg2'): + try: + rc = subprocess.check_call([s, '--version'], stdout=sink, + stderr=sink) + if rc == 0: + self.gpg = s + break + except OSError: + pass + + def _get_pypirc_command(self): + """ + Get the distutils command for interacting with PyPI configurations. + :return: the command. + """ + from distutils.core import Distribution + from distutils.config import PyPIRCCommand + d = Distribution() + return PyPIRCCommand(d) + + def read_configuration(self): + """ + Read the PyPI access configuration as supported by distutils, getting + PyPI to do the actual work. This populates ``username``, ``password``, + ``realm`` and ``url`` attributes from the configuration. + """ + # get distutils to do the work + c = self._get_pypirc_command() + c.repository = self.url + cfg = c._read_pypirc() + self.username = cfg.get('username') + self.password = cfg.get('password') + self.realm = cfg.get('realm', 'pypi') + self.url = cfg.get('repository', self.url) + + def save_configuration(self): + """ + Save the PyPI access configuration. You must have set ``username`` and + ``password`` attributes before calling this method. + + Again, distutils is used to do the actual work. + """ + self.check_credentials() + # get distutils to do the work + c = self._get_pypirc_command() + c._store_pypirc(self.username, self.password) + + def check_credentials(self): + """ + Check that ``username`` and ``password`` have been set, and raise an + exception if not. + """ + if self.username is None or self.password is None: + raise DistlibException('username and password must be set') + pm = HTTPPasswordMgr() + _, netloc, _, _, _, _ = urlparse(self.url) + pm.add_password(self.realm, netloc, self.username, self.password) + self.password_handler = HTTPBasicAuthHandler(pm) + + def register(self, metadata): + """ + Register a distribution on PyPI, using the provided metadata. + + :param metadata: A :class:`Metadata` instance defining at least a name + and version number for the distribution to be + registered. + :return: The HTTP response received from PyPI upon submission of the + request. + """ + self.check_credentials() + metadata.validate() + d = metadata.todict() + d[':action'] = 'verify' + request = self.encode_request(d.items(), []) + response = self.send_request(request) + d[':action'] = 'submit' + request = self.encode_request(d.items(), []) + return self.send_request(request) + + def _reader(self, name, stream, outbuf): + """ + Thread runner for reading lines of from a subprocess into a buffer. + + :param name: The logical name of the stream (used for logging only). + :param stream: The stream to read from. This will typically a pipe + connected to the output stream of a subprocess. + :param outbuf: The list to append the read lines to. + """ + while True: + s = stream.readline() + if not s: + break + s = s.decode('utf-8').rstrip() + outbuf.append(s) + logger.debug('%s: %s' % (name, s)) + stream.close() + + def get_sign_command(self, filename, signer, sign_password, + keystore=None): + """ + Return a suitable command for signing a file. + + :param filename: The pathname to the file to be signed. + :param signer: The identifier of the signer of the file. + :param sign_password: The passphrase for the signer's + private key used for signing. + :param keystore: The path to a directory which contains the keys + used in verification. If not specified, the + instance's ``gpg_home`` attribute is used instead. + :return: The signing command as a list suitable to be + passed to :class:`subprocess.Popen`. + """ + cmd = [self.gpg, '--status-fd', '2', '--no-tty'] + if keystore is None: + keystore = self.gpg_home + if keystore: + cmd.extend(['--homedir', keystore]) + if sign_password is not None: + cmd.extend(['--batch', '--passphrase-fd', '0']) + td = tempfile.mkdtemp() + sf = os.path.join(td, os.path.basename(filename) + '.asc') + cmd.extend(['--detach-sign', '--armor', '--local-user', + signer, '--output', sf, filename]) + logger.debug('invoking: %s', ' '.join(cmd)) + return cmd, sf + + def run_command(self, cmd, input_data=None): + """ + Run a command in a child process , passing it any input data specified. + + :param cmd: The command to run. + :param input_data: If specified, this must be a byte string containing + data to be sent to the child process. + :return: A tuple consisting of the subprocess' exit code, a list of + lines read from the subprocess' ``stdout``, and a list of + lines read from the subprocess' ``stderr``. + """ + kwargs = { + 'stdout': subprocess.PIPE, + 'stderr': subprocess.PIPE, + } + if input_data is not None: + kwargs['stdin'] = subprocess.PIPE + stdout = [] + stderr = [] + p = subprocess.Popen(cmd, **kwargs) + # We don't use communicate() here because we may need to + # get clever with interacting with the command + t1 = Thread(target=self._reader, args=('stdout', p.stdout, stdout)) + t1.start() + t2 = Thread(target=self._reader, args=('stderr', p.stderr, stderr)) + t2.start() + if input_data is not None: + p.stdin.write(input_data) + p.stdin.close() + + p.wait() + t1.join() + t2.join() + return p.returncode, stdout, stderr + + def sign_file(self, filename, signer, sign_password, keystore=None): + """ + Sign a file. + + :param filename: The pathname to the file to be signed. + :param signer: The identifier of the signer of the file. + :param sign_password: The passphrase for the signer's + private key used for signing. + :param keystore: The path to a directory which contains the keys + used in signing. If not specified, the instance's + ``gpg_home`` attribute is used instead. + :return: The absolute pathname of the file where the signature is + stored. + """ + cmd, sig_file = self.get_sign_command(filename, signer, sign_password, + keystore) + rc, stdout, stderr = self.run_command(cmd, + sign_password.encode('utf-8')) + if rc != 0: + raise DistlibException('sign command failed with error ' + 'code %s' % rc) + return sig_file + + def upload_file(self, metadata, filename, signer=None, sign_password=None, + filetype='sdist', pyversion='source', keystore=None): + """ + Upload a release file to the index. + + :param metadata: A :class:`Metadata` instance defining at least a name + and version number for the file to be uploaded. + :param filename: The pathname of the file to be uploaded. + :param signer: The identifier of the signer of the file. + :param sign_password: The passphrase for the signer's + private key used for signing. + :param filetype: The type of the file being uploaded. This is the + distutils command which produced that file, e.g. + ``sdist`` or ``bdist_wheel``. + :param pyversion: The version of Python which the release relates + to. For code compatible with any Python, this would + be ``source``, otherwise it would be e.g. ``3.2``. + :param keystore: The path to a directory which contains the keys + used in signing. If not specified, the instance's + ``gpg_home`` attribute is used instead. + :return: The HTTP response received from PyPI upon submission of the + request. + """ + self.check_credentials() + if not os.path.exists(filename): + raise DistlibException('not found: %s' % filename) + metadata.validate() + d = metadata.todict() + sig_file = None + if signer: + if not self.gpg: + logger.warning('no signing program available - not signed') + else: + sig_file = self.sign_file(filename, signer, sign_password, + keystore) + with open(filename, 'rb') as f: + file_data = f.read() + md5_digest = hashlib.md5(file_data).hexdigest() + sha256_digest = hashlib.sha256(file_data).hexdigest() + d.update({ + ':action': 'file_upload', + 'protocol_version': '1', + 'filetype': filetype, + 'pyversion': pyversion, + 'md5_digest': md5_digest, + 'sha256_digest': sha256_digest, + }) + files = [('content', os.path.basename(filename), file_data)] + if sig_file: + with open(sig_file, 'rb') as f: + sig_data = f.read() + files.append(('gpg_signature', os.path.basename(sig_file), + sig_data)) + shutil.rmtree(os.path.dirname(sig_file)) + request = self.encode_request(d.items(), files) + return self.send_request(request) + + def upload_documentation(self, metadata, doc_dir): + """ + Upload documentation to the index. + + :param metadata: A :class:`Metadata` instance defining at least a name + and version number for the documentation to be + uploaded. + :param doc_dir: The pathname of the directory which contains the + documentation. This should be the directory that + contains the ``index.html`` for the documentation. + :return: The HTTP response received from PyPI upon submission of the + request. + """ + self.check_credentials() + if not os.path.isdir(doc_dir): + raise DistlibException('not a directory: %r' % doc_dir) + fn = os.path.join(doc_dir, 'index.html') + if not os.path.exists(fn): + raise DistlibException('not found: %r' % fn) + metadata.validate() + name, version = metadata.name, metadata.version + zip_data = zip_dir(doc_dir).getvalue() + fields = [(':action', 'doc_upload'), + ('name', name), ('version', version)] + files = [('content', name, zip_data)] + request = self.encode_request(fields, files) + return self.send_request(request) + + def get_verify_command(self, signature_filename, data_filename, + keystore=None): + """ + Return a suitable command for verifying a file. + + :param signature_filename: The pathname to the file containing the + signature. + :param data_filename: The pathname to the file containing the + signed data. + :param keystore: The path to a directory which contains the keys + used in verification. If not specified, the + instance's ``gpg_home`` attribute is used instead. + :return: The verifying command as a list suitable to be + passed to :class:`subprocess.Popen`. + """ + cmd = [self.gpg, '--status-fd', '2', '--no-tty'] + if keystore is None: + keystore = self.gpg_home + if keystore: + cmd.extend(['--homedir', keystore]) + cmd.extend(['--verify', signature_filename, data_filename]) + logger.debug('invoking: %s', ' '.join(cmd)) + return cmd + + def verify_signature(self, signature_filename, data_filename, + keystore=None): + """ + Verify a signature for a file. + + :param signature_filename: The pathname to the file containing the + signature. + :param data_filename: The pathname to the file containing the + signed data. + :param keystore: The path to a directory which contains the keys + used in verification. If not specified, the + instance's ``gpg_home`` attribute is used instead. + :return: True if the signature was verified, else False. + """ + if not self.gpg: + raise DistlibException('verification unavailable because gpg ' + 'unavailable') + cmd = self.get_verify_command(signature_filename, data_filename, + keystore) + rc, stdout, stderr = self.run_command(cmd) + if rc not in (0, 1): + raise DistlibException('verify command failed with error ' + 'code %s' % rc) + return rc == 0 + + def download_file(self, url, destfile, digest=None, reporthook=None): + """ + This is a convenience method for downloading a file from an URL. + Normally, this will be a file from the index, though currently + no check is made for this (i.e. a file can be downloaded from + anywhere). + + The method is just like the :func:`urlretrieve` function in the + standard library, except that it allows digest computation to be + done during download and checking that the downloaded data + matched any expected value. + + :param url: The URL of the file to be downloaded (assumed to be + available via an HTTP GET request). + :param destfile: The pathname where the downloaded file is to be + saved. + :param digest: If specified, this must be a (hasher, value) + tuple, where hasher is the algorithm used (e.g. + ``'md5'``) and ``value`` is the expected value. + :param reporthook: The same as for :func:`urlretrieve` in the + standard library. + """ + if digest is None: + digester = None + logger.debug('No digest specified') + else: + if isinstance(digest, (list, tuple)): + hasher, digest = digest + else: + hasher = 'md5' + digester = getattr(hashlib, hasher)() + logger.debug('Digest specified: %s' % digest) + # The following code is equivalent to urlretrieve. + # We need to do it this way so that we can compute the + # digest of the file as we go. + with open(destfile, 'wb') as dfp: + # addinfourl is not a context manager on 2.x + # so we have to use try/finally + sfp = self.send_request(Request(url)) + try: + headers = sfp.info() + blocksize = 8192 + size = -1 + read = 0 + blocknum = 0 + if "content-length" in headers: + size = int(headers["Content-Length"]) + if reporthook: + reporthook(blocknum, blocksize, size) + while True: + block = sfp.read(blocksize) + if not block: + break + read += len(block) + dfp.write(block) + if digester: + digester.update(block) + blocknum += 1 + if reporthook: + reporthook(blocknum, blocksize, size) + finally: + sfp.close() + + # check that we got the whole file, if we can + if size >= 0 and read < size: + raise DistlibException( + 'retrieval incomplete: got only %d out of %d bytes' + % (read, size)) + # if we have a digest, it must match. + if digester: + actual = digester.hexdigest() + if digest != actual: + raise DistlibException('%s digest mismatch for %s: expected ' + '%s, got %s' % (hasher, destfile, + digest, actual)) + logger.debug('Digest verified: %s', digest) + + def send_request(self, req): + """ + Send a standard library :class:`Request` to PyPI and return its + response. + + :param req: The request to send. + :return: The HTTP response from PyPI (a standard library HTTPResponse). + """ + handlers = [] + if self.password_handler: + handlers.append(self.password_handler) + if self.ssl_verifier: + handlers.append(self.ssl_verifier) + opener = build_opener(*handlers) + return opener.open(req) + + def encode_request(self, fields, files): + """ + Encode fields and files for posting to an HTTP server. + + :param fields: The fields to send as a list of (fieldname, value) + tuples. + :param files: The files to send as a list of (fieldname, filename, + file_bytes) tuple. + """ + # Adapted from packaging, which in turn was adapted from + # http://code.activestate.com/recipes/146306 + + parts = [] + boundary = self.boundary + for k, values in fields: + if not isinstance(values, (list, tuple)): + values = [values] + + for v in values: + parts.extend(( + b'--' + boundary, + ('Content-Disposition: form-data; name="%s"' % + k).encode('utf-8'), + b'', + v.encode('utf-8'))) + for key, filename, value in files: + parts.extend(( + b'--' + boundary, + ('Content-Disposition: form-data; name="%s"; filename="%s"' % + (key, filename)).encode('utf-8'), + b'', + value)) + + parts.extend((b'--' + boundary + b'--', b'')) + + body = b'\r\n'.join(parts) + ct = b'multipart/form-data; boundary=' + boundary + headers = { + 'Content-type': ct, + 'Content-length': str(len(body)) + } + return Request(self.url, body, headers) + + def search(self, terms, operator=None): + if isinstance(terms, string_types): + terms = {'name': terms} + rpc_proxy = ServerProxy(self.url, timeout=3.0) + try: + return rpc_proxy.search(terms, operator or 'and') + finally: + rpc_proxy('close')() diff --git a/cres/venv/lib/python3.8/site-packages/distlib/locators.py b/cres/venv/lib/python3.8/site-packages/distlib/locators.py new file mode 100644 index 000000000..12a1d0635 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/distlib/locators.py @@ -0,0 +1,1302 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2015 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# + +import gzip +from io import BytesIO +import json +import logging +import os +import posixpath +import re +try: + import threading +except ImportError: # pragma: no cover + import dummy_threading as threading +import zlib + +from . import DistlibException +from .compat import (urljoin, urlparse, urlunparse, url2pathname, pathname2url, + queue, quote, unescape, string_types, build_opener, + HTTPRedirectHandler as BaseRedirectHandler, text_type, + Request, HTTPError, URLError) +from .database import Distribution, DistributionPath, make_dist +from .metadata import Metadata, MetadataInvalidError +from .util import (cached_property, parse_credentials, ensure_slash, + split_filename, get_project_data, parse_requirement, + parse_name_and_version, ServerProxy, normalize_name) +from .version import get_scheme, UnsupportedVersionError +from .wheel import Wheel, is_compatible + +logger = logging.getLogger(__name__) + +HASHER_HASH = re.compile(r'^(\w+)=([a-f0-9]+)') +CHARSET = re.compile(r';\s*charset\s*=\s*(.*)\s*$', re.I) +HTML_CONTENT_TYPE = re.compile('text/html|application/x(ht)?ml') +DEFAULT_INDEX = 'https://pypi.org/pypi' + +def get_all_distribution_names(url=None): + """ + Return all distribution names known by an index. + :param url: The URL of the index. + :return: A list of all known distribution names. + """ + if url is None: + url = DEFAULT_INDEX + client = ServerProxy(url, timeout=3.0) + try: + return client.list_packages() + finally: + client('close')() + +class RedirectHandler(BaseRedirectHandler): + """ + A class to work around a bug in some Python 3.2.x releases. + """ + # There's a bug in the base version for some 3.2.x + # (e.g. 3.2.2 on Ubuntu Oneiric). If a Location header + # returns e.g. /abc, it bails because it says the scheme '' + # is bogus, when actually it should use the request's + # URL for the scheme. See Python issue #13696. + def http_error_302(self, req, fp, code, msg, headers): + # Some servers (incorrectly) return multiple Location headers + # (so probably same goes for URI). Use first header. + newurl = None + for key in ('location', 'uri'): + if key in headers: + newurl = headers[key] + break + if newurl is None: # pragma: no cover + return + urlparts = urlparse(newurl) + if urlparts.scheme == '': + newurl = urljoin(req.get_full_url(), newurl) + if hasattr(headers, 'replace_header'): + headers.replace_header(key, newurl) + else: + headers[key] = newurl + return BaseRedirectHandler.http_error_302(self, req, fp, code, msg, + headers) + + http_error_301 = http_error_303 = http_error_307 = http_error_302 + +class Locator(object): + """ + A base class for locators - things that locate distributions. + """ + source_extensions = ('.tar.gz', '.tar.bz2', '.tar', '.zip', '.tgz', '.tbz') + binary_extensions = ('.egg', '.exe', '.whl') + excluded_extensions = ('.pdf',) + + # A list of tags indicating which wheels you want to match. The default + # value of None matches against the tags compatible with the running + # Python. If you want to match other values, set wheel_tags on a locator + # instance to a list of tuples (pyver, abi, arch) which you want to match. + wheel_tags = None + + downloadable_extensions = source_extensions + ('.whl',) + + def __init__(self, scheme='default'): + """ + Initialise an instance. + :param scheme: Because locators look for most recent versions, they + need to know the version scheme to use. This specifies + the current PEP-recommended scheme - use ``'legacy'`` + if you need to support existing distributions on PyPI. + """ + self._cache = {} + self.scheme = scheme + # Because of bugs in some of the handlers on some of the platforms, + # we use our own opener rather than just using urlopen. + self.opener = build_opener(RedirectHandler()) + # If get_project() is called from locate(), the matcher instance + # is set from the requirement passed to locate(). See issue #18 for + # why this can be useful to know. + self.matcher = None + self.errors = queue.Queue() + + def get_errors(self): + """ + Return any errors which have occurred. + """ + result = [] + while not self.errors.empty(): # pragma: no cover + try: + e = self.errors.get(False) + result.append(e) + except self.errors.Empty: + continue + self.errors.task_done() + return result + + def clear_errors(self): + """ + Clear any errors which may have been logged. + """ + # Just get the errors and throw them away + self.get_errors() + + def clear_cache(self): + self._cache.clear() + + def _get_scheme(self): + return self._scheme + + def _set_scheme(self, value): + self._scheme = value + + scheme = property(_get_scheme, _set_scheme) + + def _get_project(self, name): + """ + For a given project, get a dictionary mapping available versions to Distribution + instances. + + This should be implemented in subclasses. + + If called from a locate() request, self.matcher will be set to a + matcher for the requirement to satisfy, otherwise it will be None. + """ + raise NotImplementedError('Please implement in the subclass') + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + raise NotImplementedError('Please implement in the subclass') + + def get_project(self, name): + """ + For a given project, get a dictionary mapping available versions to Distribution + instances. + + This calls _get_project to do all the work, and just implements a caching layer on top. + """ + if self._cache is None: # pragma: no cover + result = self._get_project(name) + elif name in self._cache: + result = self._cache[name] + else: + self.clear_errors() + result = self._get_project(name) + self._cache[name] = result + return result + + def score_url(self, url): + """ + Give an url a score which can be used to choose preferred URLs + for a given project release. + """ + t = urlparse(url) + basename = posixpath.basename(t.path) + compatible = True + is_wheel = basename.endswith('.whl') + is_downloadable = basename.endswith(self.downloadable_extensions) + if is_wheel: + compatible = is_compatible(Wheel(basename), self.wheel_tags) + return (t.scheme == 'https', 'pypi.org' in t.netloc, + is_downloadable, is_wheel, compatible, basename) + + def prefer_url(self, url1, url2): + """ + Choose one of two URLs where both are candidates for distribution + archives for the same version of a distribution (for example, + .tar.gz vs. zip). + + The current implementation favours https:// URLs over http://, archives + from PyPI over those from other locations, wheel compatibility (if a + wheel) and then the archive name. + """ + result = url2 + if url1: + s1 = self.score_url(url1) + s2 = self.score_url(url2) + if s1 > s2: + result = url1 + if result != url2: + logger.debug('Not replacing %r with %r', url1, url2) + else: + logger.debug('Replacing %r with %r', url1, url2) + return result + + def split_filename(self, filename, project_name): + """ + Attempt to split a filename in project name, version and Python version. + """ + return split_filename(filename, project_name) + + def convert_url_to_download_info(self, url, project_name): + """ + See if a URL is a candidate for a download URL for a project (the URL + has typically been scraped from an HTML page). + + If it is, a dictionary is returned with keys "name", "version", + "filename" and "url"; otherwise, None is returned. + """ + def same_project(name1, name2): + return normalize_name(name1) == normalize_name(name2) + + result = None + scheme, netloc, path, params, query, frag = urlparse(url) + if frag.lower().startswith('egg='): # pragma: no cover + logger.debug('%s: version hint in fragment: %r', + project_name, frag) + m = HASHER_HASH.match(frag) + if m: + algo, digest = m.groups() + else: + algo, digest = None, None + origpath = path + if path and path[-1] == '/': # pragma: no cover + path = path[:-1] + if path.endswith('.whl'): + try: + wheel = Wheel(path) + if not is_compatible(wheel, self.wheel_tags): + logger.debug('Wheel not compatible: %s', path) + else: + if project_name is None: + include = True + else: + include = same_project(wheel.name, project_name) + if include: + result = { + 'name': wheel.name, + 'version': wheel.version, + 'filename': wheel.filename, + 'url': urlunparse((scheme, netloc, origpath, + params, query, '')), + 'python-version': ', '.join( + ['.'.join(list(v[2:])) for v in wheel.pyver]), + } + except Exception as e: # pragma: no cover + logger.warning('invalid path for wheel: %s', path) + elif not path.endswith(self.downloadable_extensions): # pragma: no cover + logger.debug('Not downloadable: %s', path) + else: # downloadable extension + path = filename = posixpath.basename(path) + for ext in self.downloadable_extensions: + if path.endswith(ext): + path = path[:-len(ext)] + t = self.split_filename(path, project_name) + if not t: # pragma: no cover + logger.debug('No match for project/version: %s', path) + else: + name, version, pyver = t + if not project_name or same_project(project_name, name): + result = { + 'name': name, + 'version': version, + 'filename': filename, + 'url': urlunparse((scheme, netloc, origpath, + params, query, '')), + #'packagetype': 'sdist', + } + if pyver: # pragma: no cover + result['python-version'] = pyver + break + if result and algo: + result['%s_digest' % algo] = digest + return result + + def _get_digest(self, info): + """ + Get a digest from a dictionary by looking at a "digests" dictionary + or keys of the form 'algo_digest'. + + Returns a 2-tuple (algo, digest) if found, else None. Currently + looks only for SHA256, then MD5. + """ + result = None + if 'digests' in info: + digests = info['digests'] + for algo in ('sha256', 'md5'): + if algo in digests: + result = (algo, digests[algo]) + break + if not result: + for algo in ('sha256', 'md5'): + key = '%s_digest' % algo + if key in info: + result = (algo, info[key]) + break + return result + + def _update_version_data(self, result, info): + """ + Update a result dictionary (the final result from _get_project) with a + dictionary for a specific version, which typically holds information + gleaned from a filename or URL for an archive for the distribution. + """ + name = info.pop('name') + version = info.pop('version') + if version in result: + dist = result[version] + md = dist.metadata + else: + dist = make_dist(name, version, scheme=self.scheme) + md = dist.metadata + dist.digest = digest = self._get_digest(info) + url = info['url'] + result['digests'][url] = digest + if md.source_url != info['url']: + md.source_url = self.prefer_url(md.source_url, url) + result['urls'].setdefault(version, set()).add(url) + dist.locator = self + result[version] = dist + + def locate(self, requirement, prereleases=False): + """ + Find the most recent distribution which matches the given + requirement. + + :param requirement: A requirement of the form 'foo (1.0)' or perhaps + 'foo (>= 1.0, < 2.0, != 1.3)' + :param prereleases: If ``True``, allow pre-release versions + to be located. Otherwise, pre-release versions + are not returned. + :return: A :class:`Distribution` instance, or ``None`` if no such + distribution could be located. + """ + result = None + r = parse_requirement(requirement) + if r is None: # pragma: no cover + raise DistlibException('Not a valid requirement: %r' % requirement) + scheme = get_scheme(self.scheme) + self.matcher = matcher = scheme.matcher(r.requirement) + logger.debug('matcher: %s (%s)', matcher, type(matcher).__name__) + versions = self.get_project(r.name) + if len(versions) > 2: # urls and digests keys are present + # sometimes, versions are invalid + slist = [] + vcls = matcher.version_class + for k in versions: + if k in ('urls', 'digests'): + continue + try: + if not matcher.match(k): + logger.debug('%s did not match %r', matcher, k) + else: + if prereleases or not vcls(k).is_prerelease: + slist.append(k) + else: + logger.debug('skipping pre-release ' + 'version %s of %s', k, matcher.name) + except Exception: # pragma: no cover + logger.warning('error matching %s with %r', matcher, k) + pass # slist.append(k) + if len(slist) > 1: + slist = sorted(slist, key=scheme.key) + if slist: + logger.debug('sorted list: %s', slist) + version = slist[-1] + result = versions[version] + if result: + if r.extras: + result.extras = r.extras + result.download_urls = versions.get('urls', {}).get(version, set()) + d = {} + sd = versions.get('digests', {}) + for url in result.download_urls: + if url in sd: # pragma: no cover + d[url] = sd[url] + result.digests = d + self.matcher = None + return result + + +class PyPIRPCLocator(Locator): + """ + This locator uses XML-RPC to locate distributions. It therefore + cannot be used with simple mirrors (that only mirror file content). + """ + def __init__(self, url, **kwargs): + """ + Initialise an instance. + + :param url: The URL to use for XML-RPC. + :param kwargs: Passed to the superclass constructor. + """ + super(PyPIRPCLocator, self).__init__(**kwargs) + self.base_url = url + self.client = ServerProxy(url, timeout=3.0) + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + return set(self.client.list_packages()) + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + versions = self.client.package_releases(name, True) + for v in versions: + urls = self.client.release_urls(name, v) + data = self.client.release_data(name, v) + metadata = Metadata(scheme=self.scheme) + metadata.name = data['name'] + metadata.version = data['version'] + metadata.license = data.get('license') + metadata.keywords = data.get('keywords', []) + metadata.summary = data.get('summary') + dist = Distribution(metadata) + if urls: + info = urls[0] + metadata.source_url = info['url'] + dist.digest = self._get_digest(info) + dist.locator = self + result[v] = dist + for info in urls: + url = info['url'] + digest = self._get_digest(info) + result['urls'].setdefault(v, set()).add(url) + result['digests'][url] = digest + return result + +class PyPIJSONLocator(Locator): + """ + This locator uses PyPI's JSON interface. It's very limited in functionality + and probably not worth using. + """ + def __init__(self, url, **kwargs): + super(PyPIJSONLocator, self).__init__(**kwargs) + self.base_url = ensure_slash(url) + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + raise NotImplementedError('Not available from this locator') + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + url = urljoin(self.base_url, '%s/json' % quote(name)) + try: + resp = self.opener.open(url) + data = resp.read().decode() # for now + d = json.loads(data) + md = Metadata(scheme=self.scheme) + data = d['info'] + md.name = data['name'] + md.version = data['version'] + md.license = data.get('license') + md.keywords = data.get('keywords', []) + md.summary = data.get('summary') + dist = Distribution(md) + dist.locator = self + urls = d['urls'] + result[md.version] = dist + for info in d['urls']: + url = info['url'] + dist.download_urls.add(url) + dist.digests[url] = self._get_digest(info) + result['urls'].setdefault(md.version, set()).add(url) + result['digests'][url] = self._get_digest(info) + # Now get other releases + for version, infos in d['releases'].items(): + if version == md.version: + continue # already done + omd = Metadata(scheme=self.scheme) + omd.name = md.name + omd.version = version + odist = Distribution(omd) + odist.locator = self + result[version] = odist + for info in infos: + url = info['url'] + odist.download_urls.add(url) + odist.digests[url] = self._get_digest(info) + result['urls'].setdefault(version, set()).add(url) + result['digests'][url] = self._get_digest(info) +# for info in urls: +# md.source_url = info['url'] +# dist.digest = self._get_digest(info) +# dist.locator = self +# for info in urls: +# url = info['url'] +# result['urls'].setdefault(md.version, set()).add(url) +# result['digests'][url] = self._get_digest(info) + except Exception as e: + self.errors.put(text_type(e)) + logger.exception('JSON fetch failed: %s', e) + return result + + +class Page(object): + """ + This class represents a scraped HTML page. + """ + # The following slightly hairy-looking regex just looks for the contents of + # an anchor link, which has an attribute "href" either immediately preceded + # or immediately followed by a "rel" attribute. The attribute values can be + # declared with double quotes, single quotes or no quotes - which leads to + # the length of the expression. + _href = re.compile(""" +(rel\\s*=\\s*(?:"(?P[^"]*)"|'(?P[^']*)'|(?P[^>\\s\n]*))\\s+)? +href\\s*=\\s*(?:"(?P[^"]*)"|'(?P[^']*)'|(?P[^>\\s\n]*)) +(\\s+rel\\s*=\\s*(?:"(?P[^"]*)"|'(?P[^']*)'|(?P[^>\\s\n]*)))? +""", re.I | re.S | re.X) + _base = re.compile(r"""]+)""", re.I | re.S) + + def __init__(self, data, url): + """ + Initialise an instance with the Unicode page contents and the URL they + came from. + """ + self.data = data + self.base_url = self.url = url + m = self._base.search(self.data) + if m: + self.base_url = m.group(1) + + _clean_re = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I) + + @cached_property + def links(self): + """ + Return the URLs of all the links on a page together with information + about their "rel" attribute, for determining which ones to treat as + downloads and which ones to queue for further scraping. + """ + def clean(url): + "Tidy up an URL." + scheme, netloc, path, params, query, frag = urlparse(url) + return urlunparse((scheme, netloc, quote(path), + params, query, frag)) + + result = set() + for match in self._href.finditer(self.data): + d = match.groupdict('') + rel = (d['rel1'] or d['rel2'] or d['rel3'] or + d['rel4'] or d['rel5'] or d['rel6']) + url = d['url1'] or d['url2'] or d['url3'] + url = urljoin(self.base_url, url) + url = unescape(url) + url = self._clean_re.sub(lambda m: '%%%2x' % ord(m.group(0)), url) + result.add((url, rel)) + # We sort the result, hoping to bring the most recent versions + # to the front + result = sorted(result, key=lambda t: t[0], reverse=True) + return result + + +class SimpleScrapingLocator(Locator): + """ + A locator which scrapes HTML pages to locate downloads for a distribution. + This runs multiple threads to do the I/O; performance is at least as good + as pip's PackageFinder, which works in an analogous fashion. + """ + + # These are used to deal with various Content-Encoding schemes. + decoders = { + 'deflate': zlib.decompress, + 'gzip': lambda b: gzip.GzipFile(fileobj=BytesIO(d)).read(), + 'none': lambda b: b, + } + + def __init__(self, url, timeout=None, num_workers=10, **kwargs): + """ + Initialise an instance. + :param url: The root URL to use for scraping. + :param timeout: The timeout, in seconds, to be applied to requests. + This defaults to ``None`` (no timeout specified). + :param num_workers: The number of worker threads you want to do I/O, + This defaults to 10. + :param kwargs: Passed to the superclass. + """ + super(SimpleScrapingLocator, self).__init__(**kwargs) + self.base_url = ensure_slash(url) + self.timeout = timeout + self._page_cache = {} + self._seen = set() + self._to_fetch = queue.Queue() + self._bad_hosts = set() + self.skip_externals = False + self.num_workers = num_workers + self._lock = threading.RLock() + # See issue #45: we need to be resilient when the locator is used + # in a thread, e.g. with concurrent.futures. We can't use self._lock + # as it is for coordinating our internal threads - the ones created + # in _prepare_threads. + self._gplock = threading.RLock() + self.platform_check = False # See issue #112 + + def _prepare_threads(self): + """ + Threads are created only when get_project is called, and terminate + before it returns. They are there primarily to parallelise I/O (i.e. + fetching web pages). + """ + self._threads = [] + for i in range(self.num_workers): + t = threading.Thread(target=self._fetch) + t.setDaemon(True) + t.start() + self._threads.append(t) + + def _wait_threads(self): + """ + Tell all the threads to terminate (by sending a sentinel value) and + wait for them to do so. + """ + # Note that you need two loops, since you can't say which + # thread will get each sentinel + for t in self._threads: + self._to_fetch.put(None) # sentinel + for t in self._threads: + t.join() + self._threads = [] + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + with self._gplock: + self.result = result + self.project_name = name + url = urljoin(self.base_url, '%s/' % quote(name)) + self._seen.clear() + self._page_cache.clear() + self._prepare_threads() + try: + logger.debug('Queueing %s', url) + self._to_fetch.put(url) + self._to_fetch.join() + finally: + self._wait_threads() + del self.result + return result + + platform_dependent = re.compile(r'\b(linux_(i\d86|x86_64|arm\w+)|' + r'win(32|_amd64)|macosx_?\d+)\b', re.I) + + def _is_platform_dependent(self, url): + """ + Does an URL refer to a platform-specific download? + """ + return self.platform_dependent.search(url) + + def _process_download(self, url): + """ + See if an URL is a suitable download for a project. + + If it is, register information in the result dictionary (for + _get_project) about the specific version it's for. + + Note that the return value isn't actually used other than as a boolean + value. + """ + if self.platform_check and self._is_platform_dependent(url): + info = None + else: + info = self.convert_url_to_download_info(url, self.project_name) + logger.debug('process_download: %s -> %s', url, info) + if info: + with self._lock: # needed because self.result is shared + self._update_version_data(self.result, info) + return info + + def _should_queue(self, link, referrer, rel): + """ + Determine whether a link URL from a referring page and with a + particular "rel" attribute should be queued for scraping. + """ + scheme, netloc, path, _, _, _ = urlparse(link) + if path.endswith(self.source_extensions + self.binary_extensions + + self.excluded_extensions): + result = False + elif self.skip_externals and not link.startswith(self.base_url): + result = False + elif not referrer.startswith(self.base_url): + result = False + elif rel not in ('homepage', 'download'): + result = False + elif scheme not in ('http', 'https', 'ftp'): + result = False + elif self._is_platform_dependent(link): + result = False + else: + host = netloc.split(':', 1)[0] + if host.lower() == 'localhost': + result = False + else: + result = True + logger.debug('should_queue: %s (%s) from %s -> %s', link, rel, + referrer, result) + return result + + def _fetch(self): + """ + Get a URL to fetch from the work queue, get the HTML page, examine its + links for download candidates and candidates for further scraping. + + This is a handy method to run in a thread. + """ + while True: + url = self._to_fetch.get() + try: + if url: + page = self.get_page(url) + if page is None: # e.g. after an error + continue + for link, rel in page.links: + if link not in self._seen: + try: + self._seen.add(link) + if (not self._process_download(link) and + self._should_queue(link, url, rel)): + logger.debug('Queueing %s from %s', link, url) + self._to_fetch.put(link) + except MetadataInvalidError: # e.g. invalid versions + pass + except Exception as e: # pragma: no cover + self.errors.put(text_type(e)) + finally: + # always do this, to avoid hangs :-) + self._to_fetch.task_done() + if not url: + #logger.debug('Sentinel seen, quitting.') + break + + def get_page(self, url): + """ + Get the HTML for an URL, possibly from an in-memory cache. + + XXX TODO Note: this cache is never actually cleared. It's assumed that + the data won't get stale over the lifetime of a locator instance (not + necessarily true for the default_locator). + """ + # http://peak.telecommunity.com/DevCenter/EasyInstall#package-index-api + scheme, netloc, path, _, _, _ = urlparse(url) + if scheme == 'file' and os.path.isdir(url2pathname(path)): + url = urljoin(ensure_slash(url), 'index.html') + + if url in self._page_cache: + result = self._page_cache[url] + logger.debug('Returning %s from cache: %s', url, result) + else: + host = netloc.split(':', 1)[0] + result = None + if host in self._bad_hosts: + logger.debug('Skipping %s due to bad host %s', url, host) + else: + req = Request(url, headers={'Accept-encoding': 'identity'}) + try: + logger.debug('Fetching %s', url) + resp = self.opener.open(req, timeout=self.timeout) + logger.debug('Fetched %s', url) + headers = resp.info() + content_type = headers.get('Content-Type', '') + if HTML_CONTENT_TYPE.match(content_type): + final_url = resp.geturl() + data = resp.read() + encoding = headers.get('Content-Encoding') + if encoding: + decoder = self.decoders[encoding] # fail if not found + data = decoder(data) + encoding = 'utf-8' + m = CHARSET.search(content_type) + if m: + encoding = m.group(1) + try: + data = data.decode(encoding) + except UnicodeError: # pragma: no cover + data = data.decode('latin-1') # fallback + result = Page(data, final_url) + self._page_cache[final_url] = result + except HTTPError as e: + if e.code != 404: + logger.exception('Fetch failed: %s: %s', url, e) + except URLError as e: # pragma: no cover + logger.exception('Fetch failed: %s: %s', url, e) + with self._lock: + self._bad_hosts.add(host) + except Exception as e: # pragma: no cover + logger.exception('Fetch failed: %s: %s', url, e) + finally: + self._page_cache[url] = result # even if None (failure) + return result + + _distname_re = re.compile(']*>([^<]+)<') + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + result = set() + page = self.get_page(self.base_url) + if not page: + raise DistlibException('Unable to get %s' % self.base_url) + for match in self._distname_re.finditer(page.data): + result.add(match.group(1)) + return result + +class DirectoryLocator(Locator): + """ + This class locates distributions in a directory tree. + """ + + def __init__(self, path, **kwargs): + """ + Initialise an instance. + :param path: The root of the directory tree to search. + :param kwargs: Passed to the superclass constructor, + except for: + * recursive - if True (the default), subdirectories are + recursed into. If False, only the top-level directory + is searched, + """ + self.recursive = kwargs.pop('recursive', True) + super(DirectoryLocator, self).__init__(**kwargs) + path = os.path.abspath(path) + if not os.path.isdir(path): # pragma: no cover + raise DistlibException('Not a directory: %r' % path) + self.base_dir = path + + def should_include(self, filename, parent): + """ + Should a filename be considered as a candidate for a distribution + archive? As well as the filename, the directory which contains it + is provided, though not used by the current implementation. + """ + return filename.endswith(self.downloadable_extensions) + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + for root, dirs, files in os.walk(self.base_dir): + for fn in files: + if self.should_include(fn, root): + fn = os.path.join(root, fn) + url = urlunparse(('file', '', + pathname2url(os.path.abspath(fn)), + '', '', '')) + info = self.convert_url_to_download_info(url, name) + if info: + self._update_version_data(result, info) + if not self.recursive: + break + return result + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + result = set() + for root, dirs, files in os.walk(self.base_dir): + for fn in files: + if self.should_include(fn, root): + fn = os.path.join(root, fn) + url = urlunparse(('file', '', + pathname2url(os.path.abspath(fn)), + '', '', '')) + info = self.convert_url_to_download_info(url, None) + if info: + result.add(info['name']) + if not self.recursive: + break + return result + +class JSONLocator(Locator): + """ + This locator uses special extended metadata (not available on PyPI) and is + the basis of performant dependency resolution in distlib. Other locators + require archive downloads before dependencies can be determined! As you + might imagine, that can be slow. + """ + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + raise NotImplementedError('Not available from this locator') + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + data = get_project_data(name) + if data: + for info in data.get('files', []): + if info['ptype'] != 'sdist' or info['pyversion'] != 'source': + continue + # We don't store summary in project metadata as it makes + # the data bigger for no benefit during dependency + # resolution + dist = make_dist(data['name'], info['version'], + summary=data.get('summary', + 'Placeholder for summary'), + scheme=self.scheme) + md = dist.metadata + md.source_url = info['url'] + # TODO SHA256 digest + if 'digest' in info and info['digest']: + dist.digest = ('md5', info['digest']) + md.dependencies = info.get('requirements', {}) + dist.exports = info.get('exports', {}) + result[dist.version] = dist + result['urls'].setdefault(dist.version, set()).add(info['url']) + return result + +class DistPathLocator(Locator): + """ + This locator finds installed distributions in a path. It can be useful for + adding to an :class:`AggregatingLocator`. + """ + def __init__(self, distpath, **kwargs): + """ + Initialise an instance. + + :param distpath: A :class:`DistributionPath` instance to search. + """ + super(DistPathLocator, self).__init__(**kwargs) + assert isinstance(distpath, DistributionPath) + self.distpath = distpath + + def _get_project(self, name): + dist = self.distpath.get_distribution(name) + if dist is None: + result = {'urls': {}, 'digests': {}} + else: + result = { + dist.version: dist, + 'urls': {dist.version: set([dist.source_url])}, + 'digests': {dist.version: set([None])} + } + return result + + +class AggregatingLocator(Locator): + """ + This class allows you to chain and/or merge a list of locators. + """ + def __init__(self, *locators, **kwargs): + """ + Initialise an instance. + + :param locators: The list of locators to search. + :param kwargs: Passed to the superclass constructor, + except for: + * merge - if False (the default), the first successful + search from any of the locators is returned. If True, + the results from all locators are merged (this can be + slow). + """ + self.merge = kwargs.pop('merge', False) + self.locators = locators + super(AggregatingLocator, self).__init__(**kwargs) + + def clear_cache(self): + super(AggregatingLocator, self).clear_cache() + for locator in self.locators: + locator.clear_cache() + + def _set_scheme(self, value): + self._scheme = value + for locator in self.locators: + locator.scheme = value + + scheme = property(Locator.scheme.fget, _set_scheme) + + def _get_project(self, name): + result = {} + for locator in self.locators: + d = locator.get_project(name) + if d: + if self.merge: + files = result.get('urls', {}) + digests = result.get('digests', {}) + # next line could overwrite result['urls'], result['digests'] + result.update(d) + df = result.get('urls') + if files and df: + for k, v in files.items(): + if k in df: + df[k] |= v + else: + df[k] = v + dd = result.get('digests') + if digests and dd: + dd.update(digests) + else: + # See issue #18. If any dists are found and we're looking + # for specific constraints, we only return something if + # a match is found. For example, if a DirectoryLocator + # returns just foo (1.0) while we're looking for + # foo (>= 2.0), we'll pretend there was nothing there so + # that subsequent locators can be queried. Otherwise we + # would just return foo (1.0) which would then lead to a + # failure to find foo (>= 2.0), because other locators + # weren't searched. Note that this only matters when + # merge=False. + if self.matcher is None: + found = True + else: + found = False + for k in d: + if self.matcher.match(k): + found = True + break + if found: + result = d + break + return result + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + result = set() + for locator in self.locators: + try: + result |= locator.get_distribution_names() + except NotImplementedError: + pass + return result + + +# We use a legacy scheme simply because most of the dists on PyPI use legacy +# versions which don't conform to PEP 426 / PEP 440. +default_locator = AggregatingLocator( + JSONLocator(), + SimpleScrapingLocator('https://pypi.org/simple/', + timeout=3.0), + scheme='legacy') + +locate = default_locator.locate + +NAME_VERSION_RE = re.compile(r'(?P[\w-]+)\s*' + r'\(\s*(==\s*)?(?P[^)]+)\)$') + +class DependencyFinder(object): + """ + Locate dependencies for distributions. + """ + + def __init__(self, locator=None): + """ + Initialise an instance, using the specified locator + to locate distributions. + """ + self.locator = locator or default_locator + self.scheme = get_scheme(self.locator.scheme) + + def add_distribution(self, dist): + """ + Add a distribution to the finder. This will update internal information + about who provides what. + :param dist: The distribution to add. + """ + logger.debug('adding distribution %s', dist) + name = dist.key + self.dists_by_name[name] = dist + self.dists[(name, dist.version)] = dist + for p in dist.provides: + name, version = parse_name_and_version(p) + logger.debug('Add to provided: %s, %s, %s', name, version, dist) + self.provided.setdefault(name, set()).add((version, dist)) + + def remove_distribution(self, dist): + """ + Remove a distribution from the finder. This will update internal + information about who provides what. + :param dist: The distribution to remove. + """ + logger.debug('removing distribution %s', dist) + name = dist.key + del self.dists_by_name[name] + del self.dists[(name, dist.version)] + for p in dist.provides: + name, version = parse_name_and_version(p) + logger.debug('Remove from provided: %s, %s, %s', name, version, dist) + s = self.provided[name] + s.remove((version, dist)) + if not s: + del self.provided[name] + + def get_matcher(self, reqt): + """ + Get a version matcher for a requirement. + :param reqt: The requirement + :type reqt: str + :return: A version matcher (an instance of + :class:`distlib.version.Matcher`). + """ + try: + matcher = self.scheme.matcher(reqt) + except UnsupportedVersionError: # pragma: no cover + # XXX compat-mode if cannot read the version + name = reqt.split()[0] + matcher = self.scheme.matcher(name) + return matcher + + def find_providers(self, reqt): + """ + Find the distributions which can fulfill a requirement. + + :param reqt: The requirement. + :type reqt: str + :return: A set of distribution which can fulfill the requirement. + """ + matcher = self.get_matcher(reqt) + name = matcher.key # case-insensitive + result = set() + provided = self.provided + if name in provided: + for version, provider in provided[name]: + try: + match = matcher.match(version) + except UnsupportedVersionError: + match = False + + if match: + result.add(provider) + break + return result + + def try_to_replace(self, provider, other, problems): + """ + Attempt to replace one provider with another. This is typically used + when resolving dependencies from multiple sources, e.g. A requires + (B >= 1.0) while C requires (B >= 1.1). + + For successful replacement, ``provider`` must meet all the requirements + which ``other`` fulfills. + + :param provider: The provider we are trying to replace with. + :param other: The provider we're trying to replace. + :param problems: If False is returned, this will contain what + problems prevented replacement. This is currently + a tuple of the literal string 'cantreplace', + ``provider``, ``other`` and the set of requirements + that ``provider`` couldn't fulfill. + :return: True if we can replace ``other`` with ``provider``, else + False. + """ + rlist = self.reqts[other] + unmatched = set() + for s in rlist: + matcher = self.get_matcher(s) + if not matcher.match(provider.version): + unmatched.add(s) + if unmatched: + # can't replace other with provider + problems.add(('cantreplace', provider, other, + frozenset(unmatched))) + result = False + else: + # can replace other with provider + self.remove_distribution(other) + del self.reqts[other] + for s in rlist: + self.reqts.setdefault(provider, set()).add(s) + self.add_distribution(provider) + result = True + return result + + def find(self, requirement, meta_extras=None, prereleases=False): + """ + Find a distribution and all distributions it depends on. + + :param requirement: The requirement specifying the distribution to + find, or a Distribution instance. + :param meta_extras: A list of meta extras such as :test:, :build: and + so on. + :param prereleases: If ``True``, allow pre-release versions to be + returned - otherwise, don't return prereleases + unless they're all that's available. + + Return a set of :class:`Distribution` instances and a set of + problems. + + The distributions returned should be such that they have the + :attr:`required` attribute set to ``True`` if they were + from the ``requirement`` passed to ``find()``, and they have the + :attr:`build_time_dependency` attribute set to ``True`` unless they + are post-installation dependencies of the ``requirement``. + + The problems should be a tuple consisting of the string + ``'unsatisfied'`` and the requirement which couldn't be satisfied + by any distribution known to the locator. + """ + + self.provided = {} + self.dists = {} + self.dists_by_name = {} + self.reqts = {} + + meta_extras = set(meta_extras or []) + if ':*:' in meta_extras: + meta_extras.remove(':*:') + # :meta: and :run: are implicitly included + meta_extras |= set([':test:', ':build:', ':dev:']) + + if isinstance(requirement, Distribution): + dist = odist = requirement + logger.debug('passed %s as requirement', odist) + else: + dist = odist = self.locator.locate(requirement, + prereleases=prereleases) + if dist is None: + raise DistlibException('Unable to locate %r' % requirement) + logger.debug('located %s', odist) + dist.requested = True + problems = set() + todo = set([dist]) + install_dists = set([odist]) + while todo: + dist = todo.pop() + name = dist.key # case-insensitive + if name not in self.dists_by_name: + self.add_distribution(dist) + else: + #import pdb; pdb.set_trace() + other = self.dists_by_name[name] + if other != dist: + self.try_to_replace(dist, other, problems) + + ireqts = dist.run_requires | dist.meta_requires + sreqts = dist.build_requires + ereqts = set() + if meta_extras and dist in install_dists: + for key in ('test', 'build', 'dev'): + e = ':%s:' % key + if e in meta_extras: + ereqts |= getattr(dist, '%s_requires' % key) + all_reqts = ireqts | sreqts | ereqts + for r in all_reqts: + providers = self.find_providers(r) + if not providers: + logger.debug('No providers found for %r', r) + provider = self.locator.locate(r, prereleases=prereleases) + # If no provider is found and we didn't consider + # prereleases, consider them now. + if provider is None and not prereleases: + provider = self.locator.locate(r, prereleases=True) + if provider is None: + logger.debug('Cannot satisfy %r', r) + problems.add(('unsatisfied', r)) + else: + n, v = provider.key, provider.version + if (n, v) not in self.dists: + todo.add(provider) + providers.add(provider) + if r in ireqts and dist in install_dists: + install_dists.add(provider) + logger.debug('Adding %s to install_dists', + provider.name_and_version) + for p in providers: + name = p.key + if name not in self.dists_by_name: + self.reqts.setdefault(p, set()).add(r) + else: + other = self.dists_by_name[name] + if other != p: + # see if other can be replaced by p + self.try_to_replace(p, other, problems) + + dists = set(self.dists.values()) + for dist in dists: + dist.build_time_dependency = dist not in install_dists + if dist.build_time_dependency: + logger.debug('%s is a build-time dependency only.', + dist.name_and_version) + logger.debug('find done for %s', odist) + return dists, problems diff --git a/cres/venv/lib/python3.8/site-packages/distlib/manifest.py b/cres/venv/lib/python3.8/site-packages/distlib/manifest.py new file mode 100644 index 000000000..ca0fe442d --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/distlib/manifest.py @@ -0,0 +1,393 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2013 Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +""" +Class representing the list of files in a distribution. + +Equivalent to distutils.filelist, but fixes some problems. +""" +import fnmatch +import logging +import os +import re +import sys + +from . import DistlibException +from .compat import fsdecode +from .util import convert_path + + +__all__ = ['Manifest'] + +logger = logging.getLogger(__name__) + +# a \ followed by some spaces + EOL +_COLLAPSE_PATTERN = re.compile('\\\\w*\n', re.M) +_COMMENTED_LINE = re.compile('#.*?(?=\n)|\n(?=$)', re.M | re.S) + +# +# Due to the different results returned by fnmatch.translate, we need +# to do slightly different processing for Python 2.7 and 3.2 ... this needed +# to be brought in for Python 3.6 onwards. +# +_PYTHON_VERSION = sys.version_info[:2] + +class Manifest(object): + """A list of files built by on exploring the filesystem and filtered by + applying various patterns to what we find there. + """ + + def __init__(self, base=None): + """ + Initialise an instance. + + :param base: The base directory to explore under. + """ + self.base = os.path.abspath(os.path.normpath(base or os.getcwd())) + self.prefix = self.base + os.sep + self.allfiles = None + self.files = set() + + # + # Public API + # + + def findall(self): + """Find all files under the base and set ``allfiles`` to the absolute + pathnames of files found. + """ + from stat import S_ISREG, S_ISDIR, S_ISLNK + + self.allfiles = allfiles = [] + root = self.base + stack = [root] + pop = stack.pop + push = stack.append + + while stack: + root = pop() + names = os.listdir(root) + + for name in names: + fullname = os.path.join(root, name) + + # Avoid excess stat calls -- just one will do, thank you! + stat = os.stat(fullname) + mode = stat.st_mode + if S_ISREG(mode): + allfiles.append(fsdecode(fullname)) + elif S_ISDIR(mode) and not S_ISLNK(mode): + push(fullname) + + def add(self, item): + """ + Add a file to the manifest. + + :param item: The pathname to add. This can be relative to the base. + """ + if not item.startswith(self.prefix): + item = os.path.join(self.base, item) + self.files.add(os.path.normpath(item)) + + def add_many(self, items): + """ + Add a list of files to the manifest. + + :param items: The pathnames to add. These can be relative to the base. + """ + for item in items: + self.add(item) + + def sorted(self, wantdirs=False): + """ + Return sorted files in directory order + """ + + def add_dir(dirs, d): + dirs.add(d) + logger.debug('add_dir added %s', d) + if d != self.base: + parent, _ = os.path.split(d) + assert parent not in ('', '/') + add_dir(dirs, parent) + + result = set(self.files) # make a copy! + if wantdirs: + dirs = set() + for f in result: + add_dir(dirs, os.path.dirname(f)) + result |= dirs + return [os.path.join(*path_tuple) for path_tuple in + sorted(os.path.split(path) for path in result)] + + def clear(self): + """Clear all collected files.""" + self.files = set() + self.allfiles = [] + + def process_directive(self, directive): + """ + Process a directive which either adds some files from ``allfiles`` to + ``files``, or removes some files from ``files``. + + :param directive: The directive to process. This should be in a format + compatible with distutils ``MANIFEST.in`` files: + + http://docs.python.org/distutils/sourcedist.html#commands + """ + # Parse the line: split it up, make sure the right number of words + # is there, and return the relevant words. 'action' is always + # defined: it's the first word of the line. Which of the other + # three are defined depends on the action; it'll be either + # patterns, (dir and patterns), or (dirpattern). + action, patterns, thedir, dirpattern = self._parse_directive(directive) + + # OK, now we know that the action is valid and we have the + # right number of words on the line for that action -- so we + # can proceed with minimal error-checking. + if action == 'include': + for pattern in patterns: + if not self._include_pattern(pattern, anchor=True): + logger.warning('no files found matching %r', pattern) + + elif action == 'exclude': + for pattern in patterns: + found = self._exclude_pattern(pattern, anchor=True) + #if not found: + # logger.warning('no previously-included files ' + # 'found matching %r', pattern) + + elif action == 'global-include': + for pattern in patterns: + if not self._include_pattern(pattern, anchor=False): + logger.warning('no files found matching %r ' + 'anywhere in distribution', pattern) + + elif action == 'global-exclude': + for pattern in patterns: + found = self._exclude_pattern(pattern, anchor=False) + #if not found: + # logger.warning('no previously-included files ' + # 'matching %r found anywhere in ' + # 'distribution', pattern) + + elif action == 'recursive-include': + for pattern in patterns: + if not self._include_pattern(pattern, prefix=thedir): + logger.warning('no files found matching %r ' + 'under directory %r', pattern, thedir) + + elif action == 'recursive-exclude': + for pattern in patterns: + found = self._exclude_pattern(pattern, prefix=thedir) + #if not found: + # logger.warning('no previously-included files ' + # 'matching %r found under directory %r', + # pattern, thedir) + + elif action == 'graft': + if not self._include_pattern(None, prefix=dirpattern): + logger.warning('no directories found matching %r', + dirpattern) + + elif action == 'prune': + if not self._exclude_pattern(None, prefix=dirpattern): + logger.warning('no previously-included directories found ' + 'matching %r', dirpattern) + else: # pragma: no cover + # This should never happen, as it should be caught in + # _parse_template_line + raise DistlibException( + 'invalid action %r' % action) + + # + # Private API + # + + def _parse_directive(self, directive): + """ + Validate a directive. + :param directive: The directive to validate. + :return: A tuple of action, patterns, thedir, dir_patterns + """ + words = directive.split() + if len(words) == 1 and words[0] not in ('include', 'exclude', + 'global-include', + 'global-exclude', + 'recursive-include', + 'recursive-exclude', + 'graft', 'prune'): + # no action given, let's use the default 'include' + words.insert(0, 'include') + + action = words[0] + patterns = thedir = dir_pattern = None + + if action in ('include', 'exclude', + 'global-include', 'global-exclude'): + if len(words) < 2: + raise DistlibException( + '%r expects ...' % action) + + patterns = [convert_path(word) for word in words[1:]] + + elif action in ('recursive-include', 'recursive-exclude'): + if len(words) < 3: + raise DistlibException( + '%r expects ...' % action) + + thedir = convert_path(words[1]) + patterns = [convert_path(word) for word in words[2:]] + + elif action in ('graft', 'prune'): + if len(words) != 2: + raise DistlibException( + '%r expects a single ' % action) + + dir_pattern = convert_path(words[1]) + + else: + raise DistlibException('unknown action %r' % action) + + return action, patterns, thedir, dir_pattern + + def _include_pattern(self, pattern, anchor=True, prefix=None, + is_regex=False): + """Select strings (presumably filenames) from 'self.files' that + match 'pattern', a Unix-style wildcard (glob) pattern. + + Patterns are not quite the same as implemented by the 'fnmatch' + module: '*' and '?' match non-special characters, where "special" + is platform-dependent: slash on Unix; colon, slash, and backslash on + DOS/Windows; and colon on Mac OS. + + If 'anchor' is true (the default), then the pattern match is more + stringent: "*.py" will match "foo.py" but not "foo/bar.py". If + 'anchor' is false, both of these will match. + + If 'prefix' is supplied, then only filenames starting with 'prefix' + (itself a pattern) and ending with 'pattern', with anything in between + them, will match. 'anchor' is ignored in this case. + + If 'is_regex' is true, 'anchor' and 'prefix' are ignored, and + 'pattern' is assumed to be either a string containing a regex or a + regex object -- no translation is done, the regex is just compiled + and used as-is. + + Selected strings will be added to self.files. + + Return True if files are found. + """ + # XXX docstring lying about what the special chars are? + found = False + pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex) + + # delayed loading of allfiles list + if self.allfiles is None: + self.findall() + + for name in self.allfiles: + if pattern_re.search(name): + self.files.add(name) + found = True + return found + + def _exclude_pattern(self, pattern, anchor=True, prefix=None, + is_regex=False): + """Remove strings (presumably filenames) from 'files' that match + 'pattern'. + + Other parameters are the same as for 'include_pattern()', above. + The list 'self.files' is modified in place. Return True if files are + found. + + This API is public to allow e.g. exclusion of SCM subdirs, e.g. when + packaging source distributions + """ + found = False + pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex) + for f in list(self.files): + if pattern_re.search(f): + self.files.remove(f) + found = True + return found + + def _translate_pattern(self, pattern, anchor=True, prefix=None, + is_regex=False): + """Translate a shell-like wildcard pattern to a compiled regular + expression. + + Return the compiled regex. If 'is_regex' true, + then 'pattern' is directly compiled to a regex (if it's a string) + or just returned as-is (assumes it's a regex object). + """ + if is_regex: + if isinstance(pattern, str): + return re.compile(pattern) + else: + return pattern + + if _PYTHON_VERSION > (3, 2): + # ditch start and end characters + start, _, end = self._glob_to_re('_').partition('_') + + if pattern: + pattern_re = self._glob_to_re(pattern) + if _PYTHON_VERSION > (3, 2): + assert pattern_re.startswith(start) and pattern_re.endswith(end) + else: + pattern_re = '' + + base = re.escape(os.path.join(self.base, '')) + if prefix is not None: + # ditch end of pattern character + if _PYTHON_VERSION <= (3, 2): + empty_pattern = self._glob_to_re('') + prefix_re = self._glob_to_re(prefix)[:-len(empty_pattern)] + else: + prefix_re = self._glob_to_re(prefix) + assert prefix_re.startswith(start) and prefix_re.endswith(end) + prefix_re = prefix_re[len(start): len(prefix_re) - len(end)] + sep = os.sep + if os.sep == '\\': + sep = r'\\' + if _PYTHON_VERSION <= (3, 2): + pattern_re = '^' + base + sep.join((prefix_re, + '.*' + pattern_re)) + else: + pattern_re = pattern_re[len(start): len(pattern_re) - len(end)] + pattern_re = r'%s%s%s%s.*%s%s' % (start, base, prefix_re, sep, + pattern_re, end) + else: # no prefix -- respect anchor flag + if anchor: + if _PYTHON_VERSION <= (3, 2): + pattern_re = '^' + base + pattern_re + else: + pattern_re = r'%s%s%s' % (start, base, pattern_re[len(start):]) + + return re.compile(pattern_re) + + def _glob_to_re(self, pattern): + """Translate a shell-like glob pattern to a regular expression. + + Return a string containing the regex. Differs from + 'fnmatch.translate()' in that '*' does not match "special characters" + (which are platform-specific). + """ + pattern_re = fnmatch.translate(pattern) + + # '?' and '*' in the glob pattern become '.' and '.*' in the RE, which + # IMHO is wrong -- '?' and '*' aren't supposed to match slash in Unix, + # and by extension they shouldn't match such "special characters" under + # any OS. So change all non-escaped dots in the RE to match any + # character except the special characters (currently: just os.sep). + sep = os.sep + if os.sep == '\\': + # we're using a regex to manipulate a regex, so we need + # to escape the backslash twice + sep = r'\\\\' + escaped = r'\1[^%s]' % sep + pattern_re = re.sub(r'((? y, + '!=': lambda x, y: x != y, + '<': lambda x, y: x < y, + '<=': lambda x, y: x == y or x < y, + '>': lambda x, y: x > y, + '>=': lambda x, y: x == y or x > y, + 'and': lambda x, y: x and y, + 'or': lambda x, y: x or y, + 'in': lambda x, y: x in y, + 'not in': lambda x, y: x not in y, + } + + def evaluate(self, expr, context): + """ + Evaluate a marker expression returned by the :func:`parse_requirement` + function in the specified context. + """ + if isinstance(expr, string_types): + if expr[0] in '\'"': + result = expr[1:-1] + else: + if expr not in context: + raise SyntaxError('unknown variable: %s' % expr) + result = context[expr] + else: + assert isinstance(expr, dict) + op = expr['op'] + if op not in self.operations: + raise NotImplementedError('op not implemented: %s' % op) + elhs = expr['lhs'] + erhs = expr['rhs'] + if _is_literal(expr['lhs']) and _is_literal(expr['rhs']): + raise SyntaxError('invalid comparison: %s %s %s' % (elhs, op, erhs)) + + lhs = self.evaluate(elhs, context) + rhs = self.evaluate(erhs, context) + result = self.operations[op](lhs, rhs) + return result + +def default_context(): + def format_full_version(info): + version = '%s.%s.%s' % (info.major, info.minor, info.micro) + kind = info.releaselevel + if kind != 'final': + version += kind[0] + str(info.serial) + return version + + if hasattr(sys, 'implementation'): + implementation_version = format_full_version(sys.implementation.version) + implementation_name = sys.implementation.name + else: + implementation_version = '0' + implementation_name = '' + + result = { + 'implementation_name': implementation_name, + 'implementation_version': implementation_version, + 'os_name': os.name, + 'platform_machine': platform.machine(), + 'platform_python_implementation': platform.python_implementation(), + 'platform_release': platform.release(), + 'platform_system': platform.system(), + 'platform_version': platform.version(), + 'platform_in_venv': str(in_venv()), + 'python_full_version': platform.python_version(), + 'python_version': platform.python_version()[:3], + 'sys_platform': sys.platform, + } + return result + +DEFAULT_CONTEXT = default_context() +del default_context + +evaluator = Evaluator() + +def interpret(marker, execution_context=None): + """ + Interpret a marker and return a result depending on environment. + + :param marker: The marker to interpret. + :type marker: str + :param execution_context: The context used for name lookup. + :type execution_context: mapping + """ + try: + expr, rest = parse_marker(marker) + except Exception as e: + raise SyntaxError('Unable to interpret marker syntax: %s: %s' % (marker, e)) + if rest and rest[0] != '#': + raise SyntaxError('unexpected trailing data in marker: %s: %s' % (marker, rest)) + context = dict(DEFAULT_CONTEXT) + if execution_context: + context.update(execution_context) + return evaluator.evaluate(expr, context) diff --git a/cres/venv/lib/python3.8/site-packages/distlib/metadata.py b/cres/venv/lib/python3.8/site-packages/distlib/metadata.py new file mode 100644 index 000000000..2d61378e9 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/distlib/metadata.py @@ -0,0 +1,1096 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Implementation of the Metadata for Python packages PEPs. + +Supports all metadata formats (1.0, 1.1, 1.2, and 2.0 experimental). +""" +from __future__ import unicode_literals + +import codecs +from email import message_from_file +import json +import logging +import re + + +from . import DistlibException, __version__ +from .compat import StringIO, string_types, text_type +from .markers import interpret +from .util import extract_by_key, get_extras +from .version import get_scheme, PEP440_VERSION_RE + +logger = logging.getLogger(__name__) + + +class MetadataMissingError(DistlibException): + """A required metadata is missing""" + + +class MetadataConflictError(DistlibException): + """Attempt to read or write metadata fields that are conflictual.""" + + +class MetadataUnrecognizedVersionError(DistlibException): + """Unknown metadata version number.""" + + +class MetadataInvalidError(DistlibException): + """A metadata value is invalid""" + +# public API of this module +__all__ = ['Metadata', 'PKG_INFO_ENCODING', 'PKG_INFO_PREFERRED_VERSION'] + +# Encoding used for the PKG-INFO files +PKG_INFO_ENCODING = 'utf-8' + +# preferred version. Hopefully will be changed +# to 1.2 once PEP 345 is supported everywhere +PKG_INFO_PREFERRED_VERSION = '1.1' + +_LINE_PREFIX_1_2 = re.compile('\n \\|') +_LINE_PREFIX_PRE_1_2 = re.compile('\n ') +_241_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'License') + +_314_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Supported-Platform', 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'License', 'Classifier', 'Download-URL', 'Obsoletes', + 'Provides', 'Requires') + +_314_MARKERS = ('Obsoletes', 'Provides', 'Requires', 'Classifier', + 'Download-URL') + +_345_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Supported-Platform', 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'Maintainer', 'Maintainer-email', 'License', + 'Classifier', 'Download-URL', 'Obsoletes-Dist', + 'Project-URL', 'Provides-Dist', 'Requires-Dist', + 'Requires-Python', 'Requires-External') + +_345_MARKERS = ('Provides-Dist', 'Requires-Dist', 'Requires-Python', + 'Obsoletes-Dist', 'Requires-External', 'Maintainer', + 'Maintainer-email', 'Project-URL') + +_426_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Supported-Platform', 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'Maintainer', 'Maintainer-email', 'License', + 'Classifier', 'Download-URL', 'Obsoletes-Dist', + 'Project-URL', 'Provides-Dist', 'Requires-Dist', + 'Requires-Python', 'Requires-External', 'Private-Version', + 'Obsoleted-By', 'Setup-Requires-Dist', 'Extension', + 'Provides-Extra') + +_426_MARKERS = ('Private-Version', 'Provides-Extra', 'Obsoleted-By', + 'Setup-Requires-Dist', 'Extension') + +# See issue #106: Sometimes 'Requires' and 'Provides' occur wrongly in +# the metadata. Include them in the tuple literal below to allow them +# (for now). +_566_FIELDS = _426_FIELDS + ('Description-Content-Type', + 'Requires', 'Provides') + +_566_MARKERS = ('Description-Content-Type',) + +_ALL_FIELDS = set() +_ALL_FIELDS.update(_241_FIELDS) +_ALL_FIELDS.update(_314_FIELDS) +_ALL_FIELDS.update(_345_FIELDS) +_ALL_FIELDS.update(_426_FIELDS) +_ALL_FIELDS.update(_566_FIELDS) + +EXTRA_RE = re.compile(r'''extra\s*==\s*("([^"]+)"|'([^']+)')''') + + +def _version2fieldlist(version): + if version == '1.0': + return _241_FIELDS + elif version == '1.1': + return _314_FIELDS + elif version == '1.2': + return _345_FIELDS + elif version in ('1.3', '2.1'): + return _345_FIELDS + _566_FIELDS + elif version == '2.0': + return _426_FIELDS + raise MetadataUnrecognizedVersionError(version) + + +def _best_version(fields): + """Detect the best version depending on the fields used.""" + def _has_marker(keys, markers): + for marker in markers: + if marker in keys: + return True + return False + + keys = [] + for key, value in fields.items(): + if value in ([], 'UNKNOWN', None): + continue + keys.append(key) + + possible_versions = ['1.0', '1.1', '1.2', '1.3', '2.0', '2.1'] + + # first let's try to see if a field is not part of one of the version + for key in keys: + if key not in _241_FIELDS and '1.0' in possible_versions: + possible_versions.remove('1.0') + logger.debug('Removed 1.0 due to %s', key) + if key not in _314_FIELDS and '1.1' in possible_versions: + possible_versions.remove('1.1') + logger.debug('Removed 1.1 due to %s', key) + if key not in _345_FIELDS and '1.2' in possible_versions: + possible_versions.remove('1.2') + logger.debug('Removed 1.2 due to %s', key) + if key not in _566_FIELDS and '1.3' in possible_versions: + possible_versions.remove('1.3') + logger.debug('Removed 1.3 due to %s', key) + if key not in _566_FIELDS and '2.1' in possible_versions: + if key != 'Description': # In 2.1, description allowed after headers + possible_versions.remove('2.1') + logger.debug('Removed 2.1 due to %s', key) + if key not in _426_FIELDS and '2.0' in possible_versions: + possible_versions.remove('2.0') + logger.debug('Removed 2.0 due to %s', key) + + # possible_version contains qualified versions + if len(possible_versions) == 1: + return possible_versions[0] # found ! + elif len(possible_versions) == 0: + logger.debug('Out of options - unknown metadata set: %s', fields) + raise MetadataConflictError('Unknown metadata set') + + # let's see if one unique marker is found + is_1_1 = '1.1' in possible_versions and _has_marker(keys, _314_MARKERS) + is_1_2 = '1.2' in possible_versions and _has_marker(keys, _345_MARKERS) + is_2_1 = '2.1' in possible_versions and _has_marker(keys, _566_MARKERS) + is_2_0 = '2.0' in possible_versions and _has_marker(keys, _426_MARKERS) + if int(is_1_1) + int(is_1_2) + int(is_2_1) + int(is_2_0) > 1: + raise MetadataConflictError('You used incompatible 1.1/1.2/2.0/2.1 fields') + + # we have the choice, 1.0, or 1.2, or 2.0 + # - 1.0 has a broken Summary field but works with all tools + # - 1.1 is to avoid + # - 1.2 fixes Summary but has little adoption + # - 2.0 adds more features and is very new + if not is_1_1 and not is_1_2 and not is_2_1 and not is_2_0: + # we couldn't find any specific marker + if PKG_INFO_PREFERRED_VERSION in possible_versions: + return PKG_INFO_PREFERRED_VERSION + if is_1_1: + return '1.1' + if is_1_2: + return '1.2' + if is_2_1: + return '2.1' + + return '2.0' + +_ATTR2FIELD = { + 'metadata_version': 'Metadata-Version', + 'name': 'Name', + 'version': 'Version', + 'platform': 'Platform', + 'supported_platform': 'Supported-Platform', + 'summary': 'Summary', + 'description': 'Description', + 'keywords': 'Keywords', + 'home_page': 'Home-page', + 'author': 'Author', + 'author_email': 'Author-email', + 'maintainer': 'Maintainer', + 'maintainer_email': 'Maintainer-email', + 'license': 'License', + 'classifier': 'Classifier', + 'download_url': 'Download-URL', + 'obsoletes_dist': 'Obsoletes-Dist', + 'provides_dist': 'Provides-Dist', + 'requires_dist': 'Requires-Dist', + 'setup_requires_dist': 'Setup-Requires-Dist', + 'requires_python': 'Requires-Python', + 'requires_external': 'Requires-External', + 'requires': 'Requires', + 'provides': 'Provides', + 'obsoletes': 'Obsoletes', + 'project_url': 'Project-URL', + 'private_version': 'Private-Version', + 'obsoleted_by': 'Obsoleted-By', + 'extension': 'Extension', + 'provides_extra': 'Provides-Extra', +} + +_PREDICATE_FIELDS = ('Requires-Dist', 'Obsoletes-Dist', 'Provides-Dist') +_VERSIONS_FIELDS = ('Requires-Python',) +_VERSION_FIELDS = ('Version',) +_LISTFIELDS = ('Platform', 'Classifier', 'Obsoletes', + 'Requires', 'Provides', 'Obsoletes-Dist', + 'Provides-Dist', 'Requires-Dist', 'Requires-External', + 'Project-URL', 'Supported-Platform', 'Setup-Requires-Dist', + 'Provides-Extra', 'Extension') +_LISTTUPLEFIELDS = ('Project-URL',) + +_ELEMENTSFIELD = ('Keywords',) + +_UNICODEFIELDS = ('Author', 'Maintainer', 'Summary', 'Description') + +_MISSING = object() + +_FILESAFE = re.compile('[^A-Za-z0-9.]+') + + +def _get_name_and_version(name, version, for_filename=False): + """Return the distribution name with version. + + If for_filename is true, return a filename-escaped form.""" + if for_filename: + # For both name and version any runs of non-alphanumeric or '.' + # characters are replaced with a single '-'. Additionally any + # spaces in the version string become '.' + name = _FILESAFE.sub('-', name) + version = _FILESAFE.sub('-', version.replace(' ', '.')) + return '%s-%s' % (name, version) + + +class LegacyMetadata(object): + """The legacy metadata of a release. + + Supports versions 1.0, 1.1 and 1.2 (auto-detected). You can + instantiate the class with one of these arguments (or none): + - *path*, the path to a metadata file + - *fileobj* give a file-like object with metadata as content + - *mapping* is a dict-like object + - *scheme* is a version scheme name + """ + # TODO document the mapping API and UNKNOWN default key + + def __init__(self, path=None, fileobj=None, mapping=None, + scheme='default'): + if [path, fileobj, mapping].count(None) < 2: + raise TypeError('path, fileobj and mapping are exclusive') + self._fields = {} + self.requires_files = [] + self._dependencies = None + self.scheme = scheme + if path is not None: + self.read(path) + elif fileobj is not None: + self.read_file(fileobj) + elif mapping is not None: + self.update(mapping) + self.set_metadata_version() + + def set_metadata_version(self): + self._fields['Metadata-Version'] = _best_version(self._fields) + + def _write_field(self, fileobj, name, value): + fileobj.write('%s: %s\n' % (name, value)) + + def __getitem__(self, name): + return self.get(name) + + def __setitem__(self, name, value): + return self.set(name, value) + + def __delitem__(self, name): + field_name = self._convert_name(name) + try: + del self._fields[field_name] + except KeyError: + raise KeyError(name) + + def __contains__(self, name): + return (name in self._fields or + self._convert_name(name) in self._fields) + + def _convert_name(self, name): + if name in _ALL_FIELDS: + return name + name = name.replace('-', '_').lower() + return _ATTR2FIELD.get(name, name) + + def _default_value(self, name): + if name in _LISTFIELDS or name in _ELEMENTSFIELD: + return [] + return 'UNKNOWN' + + def _remove_line_prefix(self, value): + if self.metadata_version in ('1.0', '1.1'): + return _LINE_PREFIX_PRE_1_2.sub('\n', value) + else: + return _LINE_PREFIX_1_2.sub('\n', value) + + def __getattr__(self, name): + if name in _ATTR2FIELD: + return self[name] + raise AttributeError(name) + + # + # Public API + # + +# dependencies = property(_get_dependencies, _set_dependencies) + + def get_fullname(self, filesafe=False): + """Return the distribution name with version. + + If filesafe is true, return a filename-escaped form.""" + return _get_name_and_version(self['Name'], self['Version'], filesafe) + + def is_field(self, name): + """return True if name is a valid metadata key""" + name = self._convert_name(name) + return name in _ALL_FIELDS + + def is_multi_field(self, name): + name = self._convert_name(name) + return name in _LISTFIELDS + + def read(self, filepath): + """Read the metadata values from a file path.""" + fp = codecs.open(filepath, 'r', encoding='utf-8') + try: + self.read_file(fp) + finally: + fp.close() + + def read_file(self, fileob): + """Read the metadata values from a file object.""" + msg = message_from_file(fileob) + self._fields['Metadata-Version'] = msg['metadata-version'] + + # When reading, get all the fields we can + for field in _ALL_FIELDS: + if field not in msg: + continue + if field in _LISTFIELDS: + # we can have multiple lines + values = msg.get_all(field) + if field in _LISTTUPLEFIELDS and values is not None: + values = [tuple(value.split(',')) for value in values] + self.set(field, values) + else: + # single line + value = msg[field] + if value is not None and value != 'UNKNOWN': + self.set(field, value) + # logger.debug('Attempting to set metadata for %s', self) + # self.set_metadata_version() + + def write(self, filepath, skip_unknown=False): + """Write the metadata fields to filepath.""" + fp = codecs.open(filepath, 'w', encoding='utf-8') + try: + self.write_file(fp, skip_unknown) + finally: + fp.close() + + def write_file(self, fileobject, skip_unknown=False): + """Write the PKG-INFO format data to a file object.""" + self.set_metadata_version() + + for field in _version2fieldlist(self['Metadata-Version']): + values = self.get(field) + if skip_unknown and values in ('UNKNOWN', [], ['UNKNOWN']): + continue + if field in _ELEMENTSFIELD: + self._write_field(fileobject, field, ','.join(values)) + continue + if field not in _LISTFIELDS: + if field == 'Description': + if self.metadata_version in ('1.0', '1.1'): + values = values.replace('\n', '\n ') + else: + values = values.replace('\n', '\n |') + values = [values] + + if field in _LISTTUPLEFIELDS: + values = [','.join(value) for value in values] + + for value in values: + self._write_field(fileobject, field, value) + + def update(self, other=None, **kwargs): + """Set metadata values from the given iterable `other` and kwargs. + + Behavior is like `dict.update`: If `other` has a ``keys`` method, + they are looped over and ``self[key]`` is assigned ``other[key]``. + Else, ``other`` is an iterable of ``(key, value)`` iterables. + + Keys that don't match a metadata field or that have an empty value are + dropped. + """ + def _set(key, value): + if key in _ATTR2FIELD and value: + self.set(self._convert_name(key), value) + + if not other: + # other is None or empty container + pass + elif hasattr(other, 'keys'): + for k in other.keys(): + _set(k, other[k]) + else: + for k, v in other: + _set(k, v) + + if kwargs: + for k, v in kwargs.items(): + _set(k, v) + + def set(self, name, value): + """Control then set a metadata field.""" + name = self._convert_name(name) + + if ((name in _ELEMENTSFIELD or name == 'Platform') and + not isinstance(value, (list, tuple))): + if isinstance(value, string_types): + value = [v.strip() for v in value.split(',')] + else: + value = [] + elif (name in _LISTFIELDS and + not isinstance(value, (list, tuple))): + if isinstance(value, string_types): + value = [value] + else: + value = [] + + if logger.isEnabledFor(logging.WARNING): + project_name = self['Name'] + + scheme = get_scheme(self.scheme) + if name in _PREDICATE_FIELDS and value is not None: + for v in value: + # check that the values are valid + if not scheme.is_valid_matcher(v.split(';')[0]): + logger.warning( + "'%s': '%s' is not valid (field '%s')", + project_name, v, name) + # FIXME this rejects UNKNOWN, is that right? + elif name in _VERSIONS_FIELDS and value is not None: + if not scheme.is_valid_constraint_list(value): + logger.warning("'%s': '%s' is not a valid version (field '%s')", + project_name, value, name) + elif name in _VERSION_FIELDS and value is not None: + if not scheme.is_valid_version(value): + logger.warning("'%s': '%s' is not a valid version (field '%s')", + project_name, value, name) + + if name in _UNICODEFIELDS: + if name == 'Description': + value = self._remove_line_prefix(value) + + self._fields[name] = value + + def get(self, name, default=_MISSING): + """Get a metadata field.""" + name = self._convert_name(name) + if name not in self._fields: + if default is _MISSING: + default = self._default_value(name) + return default + if name in _UNICODEFIELDS: + value = self._fields[name] + return value + elif name in _LISTFIELDS: + value = self._fields[name] + if value is None: + return [] + res = [] + for val in value: + if name not in _LISTTUPLEFIELDS: + res.append(val) + else: + # That's for Project-URL + res.append((val[0], val[1])) + return res + + elif name in _ELEMENTSFIELD: + value = self._fields[name] + if isinstance(value, string_types): + return value.split(',') + return self._fields[name] + + def check(self, strict=False): + """Check if the metadata is compliant. If strict is True then raise if + no Name or Version are provided""" + self.set_metadata_version() + + # XXX should check the versions (if the file was loaded) + missing, warnings = [], [] + + for attr in ('Name', 'Version'): # required by PEP 345 + if attr not in self: + missing.append(attr) + + if strict and missing != []: + msg = 'missing required metadata: %s' % ', '.join(missing) + raise MetadataMissingError(msg) + + for attr in ('Home-page', 'Author'): + if attr not in self: + missing.append(attr) + + # checking metadata 1.2 (XXX needs to check 1.1, 1.0) + if self['Metadata-Version'] != '1.2': + return missing, warnings + + scheme = get_scheme(self.scheme) + + def are_valid_constraints(value): + for v in value: + if not scheme.is_valid_matcher(v.split(';')[0]): + return False + return True + + for fields, controller in ((_PREDICATE_FIELDS, are_valid_constraints), + (_VERSIONS_FIELDS, + scheme.is_valid_constraint_list), + (_VERSION_FIELDS, + scheme.is_valid_version)): + for field in fields: + value = self.get(field, None) + if value is not None and not controller(value): + warnings.append("Wrong value for '%s': %s" % (field, value)) + + return missing, warnings + + def todict(self, skip_missing=False): + """Return fields as a dict. + + Field names will be converted to use the underscore-lowercase style + instead of hyphen-mixed case (i.e. home_page instead of Home-page). + """ + self.set_metadata_version() + + mapping_1_0 = ( + ('metadata_version', 'Metadata-Version'), + ('name', 'Name'), + ('version', 'Version'), + ('summary', 'Summary'), + ('home_page', 'Home-page'), + ('author', 'Author'), + ('author_email', 'Author-email'), + ('license', 'License'), + ('description', 'Description'), + ('keywords', 'Keywords'), + ('platform', 'Platform'), + ('classifiers', 'Classifier'), + ('download_url', 'Download-URL'), + ) + + data = {} + for key, field_name in mapping_1_0: + if not skip_missing or field_name in self._fields: + data[key] = self[field_name] + + if self['Metadata-Version'] == '1.2': + mapping_1_2 = ( + ('requires_dist', 'Requires-Dist'), + ('requires_python', 'Requires-Python'), + ('requires_external', 'Requires-External'), + ('provides_dist', 'Provides-Dist'), + ('obsoletes_dist', 'Obsoletes-Dist'), + ('project_url', 'Project-URL'), + ('maintainer', 'Maintainer'), + ('maintainer_email', 'Maintainer-email'), + ) + for key, field_name in mapping_1_2: + if not skip_missing or field_name in self._fields: + if key != 'project_url': + data[key] = self[field_name] + else: + data[key] = [','.join(u) for u in self[field_name]] + + elif self['Metadata-Version'] == '1.1': + mapping_1_1 = ( + ('provides', 'Provides'), + ('requires', 'Requires'), + ('obsoletes', 'Obsoletes'), + ) + for key, field_name in mapping_1_1: + if not skip_missing or field_name in self._fields: + data[key] = self[field_name] + + return data + + def add_requirements(self, requirements): + if self['Metadata-Version'] == '1.1': + # we can't have 1.1 metadata *and* Setuptools requires + for field in ('Obsoletes', 'Requires', 'Provides'): + if field in self: + del self[field] + self['Requires-Dist'] += requirements + + # Mapping API + # TODO could add iter* variants + + def keys(self): + return list(_version2fieldlist(self['Metadata-Version'])) + + def __iter__(self): + for key in self.keys(): + yield key + + def values(self): + return [self[key] for key in self.keys()] + + def items(self): + return [(key, self[key]) for key in self.keys()] + + def __repr__(self): + return '<%s %s %s>' % (self.__class__.__name__, self.name, + self.version) + + +METADATA_FILENAME = 'pydist.json' +WHEEL_METADATA_FILENAME = 'metadata.json' +LEGACY_METADATA_FILENAME = 'METADATA' + + +class Metadata(object): + """ + The metadata of a release. This implementation uses 2.0 (JSON) + metadata where possible. If not possible, it wraps a LegacyMetadata + instance which handles the key-value metadata format. + """ + + METADATA_VERSION_MATCHER = re.compile(r'^\d+(\.\d+)*$') + + NAME_MATCHER = re.compile('^[0-9A-Z]([0-9A-Z_.-]*[0-9A-Z])?$', re.I) + + VERSION_MATCHER = PEP440_VERSION_RE + + SUMMARY_MATCHER = re.compile('.{1,2047}') + + METADATA_VERSION = '2.0' + + GENERATOR = 'distlib (%s)' % __version__ + + MANDATORY_KEYS = { + 'name': (), + 'version': (), + 'summary': ('legacy',), + } + + INDEX_KEYS = ('name version license summary description author ' + 'author_email keywords platform home_page classifiers ' + 'download_url') + + DEPENDENCY_KEYS = ('extras run_requires test_requires build_requires ' + 'dev_requires provides meta_requires obsoleted_by ' + 'supports_environments') + + SYNTAX_VALIDATORS = { + 'metadata_version': (METADATA_VERSION_MATCHER, ()), + 'name': (NAME_MATCHER, ('legacy',)), + 'version': (VERSION_MATCHER, ('legacy',)), + 'summary': (SUMMARY_MATCHER, ('legacy',)), + } + + __slots__ = ('_legacy', '_data', 'scheme') + + def __init__(self, path=None, fileobj=None, mapping=None, + scheme='default'): + if [path, fileobj, mapping].count(None) < 2: + raise TypeError('path, fileobj and mapping are exclusive') + self._legacy = None + self._data = None + self.scheme = scheme + #import pdb; pdb.set_trace() + if mapping is not None: + try: + self._validate_mapping(mapping, scheme) + self._data = mapping + except MetadataUnrecognizedVersionError: + self._legacy = LegacyMetadata(mapping=mapping, scheme=scheme) + self.validate() + else: + data = None + if path: + with open(path, 'rb') as f: + data = f.read() + elif fileobj: + data = fileobj.read() + if data is None: + # Initialised with no args - to be added + self._data = { + 'metadata_version': self.METADATA_VERSION, + 'generator': self.GENERATOR, + } + else: + if not isinstance(data, text_type): + data = data.decode('utf-8') + try: + self._data = json.loads(data) + self._validate_mapping(self._data, scheme) + except ValueError: + # Note: MetadataUnrecognizedVersionError does not + # inherit from ValueError (it's a DistlibException, + # which should not inherit from ValueError). + # The ValueError comes from the json.load - if that + # succeeds and we get a validation error, we want + # that to propagate + self._legacy = LegacyMetadata(fileobj=StringIO(data), + scheme=scheme) + self.validate() + + common_keys = set(('name', 'version', 'license', 'keywords', 'summary')) + + none_list = (None, list) + none_dict = (None, dict) + + mapped_keys = { + 'run_requires': ('Requires-Dist', list), + 'build_requires': ('Setup-Requires-Dist', list), + 'dev_requires': none_list, + 'test_requires': none_list, + 'meta_requires': none_list, + 'extras': ('Provides-Extra', list), + 'modules': none_list, + 'namespaces': none_list, + 'exports': none_dict, + 'commands': none_dict, + 'classifiers': ('Classifier', list), + 'source_url': ('Download-URL', None), + 'metadata_version': ('Metadata-Version', None), + } + + del none_list, none_dict + + def __getattribute__(self, key): + common = object.__getattribute__(self, 'common_keys') + mapped = object.__getattribute__(self, 'mapped_keys') + if key in mapped: + lk, maker = mapped[key] + if self._legacy: + if lk is None: + result = None if maker is None else maker() + else: + result = self._legacy.get(lk) + else: + value = None if maker is None else maker() + if key not in ('commands', 'exports', 'modules', 'namespaces', + 'classifiers'): + result = self._data.get(key, value) + else: + # special cases for PEP 459 + sentinel = object() + result = sentinel + d = self._data.get('extensions') + if d: + if key == 'commands': + result = d.get('python.commands', value) + elif key == 'classifiers': + d = d.get('python.details') + if d: + result = d.get(key, value) + else: + d = d.get('python.exports') + if not d: + d = self._data.get('python.exports') + if d: + result = d.get(key, value) + if result is sentinel: + result = value + elif key not in common: + result = object.__getattribute__(self, key) + elif self._legacy: + result = self._legacy.get(key) + else: + result = self._data.get(key) + return result + + def _validate_value(self, key, value, scheme=None): + if key in self.SYNTAX_VALIDATORS: + pattern, exclusions = self.SYNTAX_VALIDATORS[key] + if (scheme or self.scheme) not in exclusions: + m = pattern.match(value) + if not m: + raise MetadataInvalidError("'%s' is an invalid value for " + "the '%s' property" % (value, + key)) + + def __setattr__(self, key, value): + self._validate_value(key, value) + common = object.__getattribute__(self, 'common_keys') + mapped = object.__getattribute__(self, 'mapped_keys') + if key in mapped: + lk, _ = mapped[key] + if self._legacy: + if lk is None: + raise NotImplementedError + self._legacy[lk] = value + elif key not in ('commands', 'exports', 'modules', 'namespaces', + 'classifiers'): + self._data[key] = value + else: + # special cases for PEP 459 + d = self._data.setdefault('extensions', {}) + if key == 'commands': + d['python.commands'] = value + elif key == 'classifiers': + d = d.setdefault('python.details', {}) + d[key] = value + else: + d = d.setdefault('python.exports', {}) + d[key] = value + elif key not in common: + object.__setattr__(self, key, value) + else: + if key == 'keywords': + if isinstance(value, string_types): + value = value.strip() + if value: + value = value.split() + else: + value = [] + if self._legacy: + self._legacy[key] = value + else: + self._data[key] = value + + @property + def name_and_version(self): + return _get_name_and_version(self.name, self.version, True) + + @property + def provides(self): + if self._legacy: + result = self._legacy['Provides-Dist'] + else: + result = self._data.setdefault('provides', []) + s = '%s (%s)' % (self.name, self.version) + if s not in result: + result.append(s) + return result + + @provides.setter + def provides(self, value): + if self._legacy: + self._legacy['Provides-Dist'] = value + else: + self._data['provides'] = value + + def get_requirements(self, reqts, extras=None, env=None): + """ + Base method to get dependencies, given a set of extras + to satisfy and an optional environment context. + :param reqts: A list of sometimes-wanted dependencies, + perhaps dependent on extras and environment. + :param extras: A list of optional components being requested. + :param env: An optional environment for marker evaluation. + """ + if self._legacy: + result = reqts + else: + result = [] + extras = get_extras(extras or [], self.extras) + for d in reqts: + if 'extra' not in d and 'environment' not in d: + # unconditional + include = True + else: + if 'extra' not in d: + # Not extra-dependent - only environment-dependent + include = True + else: + include = d.get('extra') in extras + if include: + # Not excluded because of extras, check environment + marker = d.get('environment') + if marker: + include = interpret(marker, env) + if include: + result.extend(d['requires']) + for key in ('build', 'dev', 'test'): + e = ':%s:' % key + if e in extras: + extras.remove(e) + # A recursive call, but it should terminate since 'test' + # has been removed from the extras + reqts = self._data.get('%s_requires' % key, []) + result.extend(self.get_requirements(reqts, extras=extras, + env=env)) + return result + + @property + def dictionary(self): + if self._legacy: + return self._from_legacy() + return self._data + + @property + def dependencies(self): + if self._legacy: + raise NotImplementedError + else: + return extract_by_key(self._data, self.DEPENDENCY_KEYS) + + @dependencies.setter + def dependencies(self, value): + if self._legacy: + raise NotImplementedError + else: + self._data.update(value) + + def _validate_mapping(self, mapping, scheme): + if mapping.get('metadata_version') != self.METADATA_VERSION: + raise MetadataUnrecognizedVersionError() + missing = [] + for key, exclusions in self.MANDATORY_KEYS.items(): + if key not in mapping: + if scheme not in exclusions: + missing.append(key) + if missing: + msg = 'Missing metadata items: %s' % ', '.join(missing) + raise MetadataMissingError(msg) + for k, v in mapping.items(): + self._validate_value(k, v, scheme) + + def validate(self): + if self._legacy: + missing, warnings = self._legacy.check(True) + if missing or warnings: + logger.warning('Metadata: missing: %s, warnings: %s', + missing, warnings) + else: + self._validate_mapping(self._data, self.scheme) + + def todict(self): + if self._legacy: + return self._legacy.todict(True) + else: + result = extract_by_key(self._data, self.INDEX_KEYS) + return result + + def _from_legacy(self): + assert self._legacy and not self._data + result = { + 'metadata_version': self.METADATA_VERSION, + 'generator': self.GENERATOR, + } + lmd = self._legacy.todict(True) # skip missing ones + for k in ('name', 'version', 'license', 'summary', 'description', + 'classifier'): + if k in lmd: + if k == 'classifier': + nk = 'classifiers' + else: + nk = k + result[nk] = lmd[k] + kw = lmd.get('Keywords', []) + if kw == ['']: + kw = [] + result['keywords'] = kw + keys = (('requires_dist', 'run_requires'), + ('setup_requires_dist', 'build_requires')) + for ok, nk in keys: + if ok in lmd and lmd[ok]: + result[nk] = [{'requires': lmd[ok]}] + result['provides'] = self.provides + author = {} + maintainer = {} + return result + + LEGACY_MAPPING = { + 'name': 'Name', + 'version': 'Version', + 'license': 'License', + 'summary': 'Summary', + 'description': 'Description', + 'classifiers': 'Classifier', + } + + def _to_legacy(self): + def process_entries(entries): + reqts = set() + for e in entries: + extra = e.get('extra') + env = e.get('environment') + rlist = e['requires'] + for r in rlist: + if not env and not extra: + reqts.add(r) + else: + marker = '' + if extra: + marker = 'extra == "%s"' % extra + if env: + if marker: + marker = '(%s) and %s' % (env, marker) + else: + marker = env + reqts.add(';'.join((r, marker))) + return reqts + + assert self._data and not self._legacy + result = LegacyMetadata() + nmd = self._data + for nk, ok in self.LEGACY_MAPPING.items(): + if nk in nmd: + result[ok] = nmd[nk] + r1 = process_entries(self.run_requires + self.meta_requires) + r2 = process_entries(self.build_requires + self.dev_requires) + if self.extras: + result['Provides-Extra'] = sorted(self.extras) + result['Requires-Dist'] = sorted(r1) + result['Setup-Requires-Dist'] = sorted(r2) + # TODO: other fields such as contacts + return result + + def write(self, path=None, fileobj=None, legacy=False, skip_unknown=True): + if [path, fileobj].count(None) != 1: + raise ValueError('Exactly one of path and fileobj is needed') + self.validate() + if legacy: + if self._legacy: + legacy_md = self._legacy + else: + legacy_md = self._to_legacy() + if path: + legacy_md.write(path, skip_unknown=skip_unknown) + else: + legacy_md.write_file(fileobj, skip_unknown=skip_unknown) + else: + if self._legacy: + d = self._from_legacy() + else: + d = self._data + if fileobj: + json.dump(d, fileobj, ensure_ascii=True, indent=2, + sort_keys=True) + else: + with codecs.open(path, 'w', 'utf-8') as f: + json.dump(d, f, ensure_ascii=True, indent=2, + sort_keys=True) + + def add_requirements(self, requirements): + if self._legacy: + self._legacy.add_requirements(requirements) + else: + run_requires = self._data.setdefault('run_requires', []) + always = None + for entry in run_requires: + if 'environment' not in entry and 'extra' not in entry: + always = entry + break + if always is None: + always = { 'requires': requirements } + run_requires.insert(0, always) + else: + rset = set(always['requires']) | set(requirements) + always['requires'] = sorted(rset) + + def __repr__(self): + name = self.name or '(no name)' + version = self.version or 'no version' + return '<%s %s %s (%s)>' % (self.__class__.__name__, + self.metadata_version, name, version) diff --git a/cres/venv/lib/python3.8/site-packages/distlib/resources.py b/cres/venv/lib/python3.8/site-packages/distlib/resources.py new file mode 100644 index 000000000..18840167a --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/distlib/resources.py @@ -0,0 +1,355 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2017 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from __future__ import unicode_literals + +import bisect +import io +import logging +import os +import pkgutil +import shutil +import sys +import types +import zipimport + +from . import DistlibException +from .util import cached_property, get_cache_base, path_to_cache_dir, Cache + +logger = logging.getLogger(__name__) + + +cache = None # created when needed + + +class ResourceCache(Cache): + def __init__(self, base=None): + if base is None: + # Use native string to avoid issues on 2.x: see Python #20140. + base = os.path.join(get_cache_base(), str('resource-cache')) + super(ResourceCache, self).__init__(base) + + def is_stale(self, resource, path): + """ + Is the cache stale for the given resource? + + :param resource: The :class:`Resource` being cached. + :param path: The path of the resource in the cache. + :return: True if the cache is stale. + """ + # Cache invalidation is a hard problem :-) + return True + + def get(self, resource): + """ + Get a resource into the cache, + + :param resource: A :class:`Resource` instance. + :return: The pathname of the resource in the cache. + """ + prefix, path = resource.finder.get_cache_info(resource) + if prefix is None: + result = path + else: + result = os.path.join(self.base, self.prefix_to_dir(prefix), path) + dirname = os.path.dirname(result) + if not os.path.isdir(dirname): + os.makedirs(dirname) + if not os.path.exists(result): + stale = True + else: + stale = self.is_stale(resource, path) + if stale: + # write the bytes of the resource to the cache location + with open(result, 'wb') as f: + f.write(resource.bytes) + return result + + +class ResourceBase(object): + def __init__(self, finder, name): + self.finder = finder + self.name = name + + +class Resource(ResourceBase): + """ + A class representing an in-package resource, such as a data file. This is + not normally instantiated by user code, but rather by a + :class:`ResourceFinder` which manages the resource. + """ + is_container = False # Backwards compatibility + + def as_stream(self): + """ + Get the resource as a stream. + + This is not a property to make it obvious that it returns a new stream + each time. + """ + return self.finder.get_stream(self) + + @cached_property + def file_path(self): + global cache + if cache is None: + cache = ResourceCache() + return cache.get(self) + + @cached_property + def bytes(self): + return self.finder.get_bytes(self) + + @cached_property + def size(self): + return self.finder.get_size(self) + + +class ResourceContainer(ResourceBase): + is_container = True # Backwards compatibility + + @cached_property + def resources(self): + return self.finder.get_resources(self) + + +class ResourceFinder(object): + """ + Resource finder for file system resources. + """ + + if sys.platform.startswith('java'): + skipped_extensions = ('.pyc', '.pyo', '.class') + else: + skipped_extensions = ('.pyc', '.pyo') + + def __init__(self, module): + self.module = module + self.loader = getattr(module, '__loader__', None) + self.base = os.path.dirname(getattr(module, '__file__', '')) + + def _adjust_path(self, path): + return os.path.realpath(path) + + def _make_path(self, resource_name): + # Issue #50: need to preserve type of path on Python 2.x + # like os.path._get_sep + if isinstance(resource_name, bytes): # should only happen on 2.x + sep = b'/' + else: + sep = '/' + parts = resource_name.split(sep) + parts.insert(0, self.base) + result = os.path.join(*parts) + return self._adjust_path(result) + + def _find(self, path): + return os.path.exists(path) + + def get_cache_info(self, resource): + return None, resource.path + + def find(self, resource_name): + path = self._make_path(resource_name) + if not self._find(path): + result = None + else: + if self._is_directory(path): + result = ResourceContainer(self, resource_name) + else: + result = Resource(self, resource_name) + result.path = path + return result + + def get_stream(self, resource): + return open(resource.path, 'rb') + + def get_bytes(self, resource): + with open(resource.path, 'rb') as f: + return f.read() + + def get_size(self, resource): + return os.path.getsize(resource.path) + + def get_resources(self, resource): + def allowed(f): + return (f != '__pycache__' and not + f.endswith(self.skipped_extensions)) + return set([f for f in os.listdir(resource.path) if allowed(f)]) + + def is_container(self, resource): + return self._is_directory(resource.path) + + _is_directory = staticmethod(os.path.isdir) + + def iterator(self, resource_name): + resource = self.find(resource_name) + if resource is not None: + todo = [resource] + while todo: + resource = todo.pop(0) + yield resource + if resource.is_container: + rname = resource.name + for name in resource.resources: + if not rname: + new_name = name + else: + new_name = '/'.join([rname, name]) + child = self.find(new_name) + if child.is_container: + todo.append(child) + else: + yield child + + +class ZipResourceFinder(ResourceFinder): + """ + Resource finder for resources in .zip files. + """ + def __init__(self, module): + super(ZipResourceFinder, self).__init__(module) + archive = self.loader.archive + self.prefix_len = 1 + len(archive) + # PyPy doesn't have a _files attr on zipimporter, and you can't set one + if hasattr(self.loader, '_files'): + self._files = self.loader._files + else: + self._files = zipimport._zip_directory_cache[archive] + self.index = sorted(self._files) + + def _adjust_path(self, path): + return path + + def _find(self, path): + path = path[self.prefix_len:] + if path in self._files: + result = True + else: + if path and path[-1] != os.sep: + path = path + os.sep + i = bisect.bisect(self.index, path) + try: + result = self.index[i].startswith(path) + except IndexError: + result = False + if not result: + logger.debug('_find failed: %r %r', path, self.loader.prefix) + else: + logger.debug('_find worked: %r %r', path, self.loader.prefix) + return result + + def get_cache_info(self, resource): + prefix = self.loader.archive + path = resource.path[1 + len(prefix):] + return prefix, path + + def get_bytes(self, resource): + return self.loader.get_data(resource.path) + + def get_stream(self, resource): + return io.BytesIO(self.get_bytes(resource)) + + def get_size(self, resource): + path = resource.path[self.prefix_len:] + return self._files[path][3] + + def get_resources(self, resource): + path = resource.path[self.prefix_len:] + if path and path[-1] != os.sep: + path += os.sep + plen = len(path) + result = set() + i = bisect.bisect(self.index, path) + while i < len(self.index): + if not self.index[i].startswith(path): + break + s = self.index[i][plen:] + result.add(s.split(os.sep, 1)[0]) # only immediate children + i += 1 + return result + + def _is_directory(self, path): + path = path[self.prefix_len:] + if path and path[-1] != os.sep: + path += os.sep + i = bisect.bisect(self.index, path) + try: + result = self.index[i].startswith(path) + except IndexError: + result = False + return result + +_finder_registry = { + type(None): ResourceFinder, + zipimport.zipimporter: ZipResourceFinder +} + +try: + # In Python 3.6, _frozen_importlib -> _frozen_importlib_external + try: + import _frozen_importlib_external as _fi + except ImportError: + import _frozen_importlib as _fi + _finder_registry[_fi.SourceFileLoader] = ResourceFinder + _finder_registry[_fi.FileFinder] = ResourceFinder + del _fi +except (ImportError, AttributeError): + pass + + +def register_finder(loader, finder_maker): + _finder_registry[type(loader)] = finder_maker + +_finder_cache = {} + + +def finder(package): + """ + Return a resource finder for a package. + :param package: The name of the package. + :return: A :class:`ResourceFinder` instance for the package. + """ + if package in _finder_cache: + result = _finder_cache[package] + else: + if package not in sys.modules: + __import__(package) + module = sys.modules[package] + path = getattr(module, '__path__', None) + if path is None: + raise DistlibException('You cannot get a finder for a module, ' + 'only for a package') + loader = getattr(module, '__loader__', None) + finder_maker = _finder_registry.get(type(loader)) + if finder_maker is None: + raise DistlibException('Unable to locate finder for %r' % package) + result = finder_maker(module) + _finder_cache[package] = result + return result + + +_dummy_module = types.ModuleType(str('__dummy__')) + + +def finder_for_path(path): + """ + Return a resource finder for a path, which should represent a container. + + :param path: The path. + :return: A :class:`ResourceFinder` instance for the path. + """ + result = None + # calls any path hooks, gets importer into cache + pkgutil.get_importer(path) + loader = sys.path_importer_cache.get(path) + finder = _finder_registry.get(type(loader)) + if finder: + module = _dummy_module + module.__file__ = os.path.join(path, '') + module.__loader__ = loader + result = finder(module) + return result diff --git a/cres/venv/lib/python3.8/site-packages/distlib/scripts.py b/cres/venv/lib/python3.8/site-packages/distlib/scripts.py new file mode 100644 index 000000000..518597418 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/distlib/scripts.py @@ -0,0 +1,416 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2015 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from io import BytesIO +import logging +import os +import re +import struct +import sys + +from .compat import sysconfig, detect_encoding, ZipFile +from .resources import finder +from .util import (FileOperator, get_export_entry, convert_path, + get_executable, in_venv) + +logger = logging.getLogger(__name__) + +_DEFAULT_MANIFEST = ''' + + + + + + + + + + + + +'''.strip() + +# check if Python is called on the first line with this expression +FIRST_LINE_RE = re.compile(b'^#!.*pythonw?[0-9.]*([ \t].*)?$') +SCRIPT_TEMPLATE = r'''# -*- coding: utf-8 -*- +import re +import sys +from %(module)s import %(import_name)s +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(%(func)s()) +''' + + +def _enquote_executable(executable): + if ' ' in executable: + # make sure we quote only the executable in case of env + # for example /usr/bin/env "/dir with spaces/bin/jython" + # instead of "/usr/bin/env /dir with spaces/bin/jython" + # otherwise whole + if executable.startswith('/usr/bin/env '): + env, _executable = executable.split(' ', 1) + if ' ' in _executable and not _executable.startswith('"'): + executable = '%s "%s"' % (env, _executable) + else: + if not executable.startswith('"'): + executable = '"%s"' % executable + return executable + + +class ScriptMaker(object): + """ + A class to copy or create scripts from source scripts or callable + specifications. + """ + script_template = SCRIPT_TEMPLATE + + executable = None # for shebangs + + def __init__(self, source_dir, target_dir, add_launchers=True, + dry_run=False, fileop=None): + self.source_dir = source_dir + self.target_dir = target_dir + self.add_launchers = add_launchers + self.force = False + self.clobber = False + # It only makes sense to set mode bits on POSIX. + self.set_mode = (os.name == 'posix') or (os.name == 'java' and + os._name == 'posix') + self.variants = set(('', 'X.Y')) + self._fileop = fileop or FileOperator(dry_run) + + self._is_nt = os.name == 'nt' or ( + os.name == 'java' and os._name == 'nt') + + def _get_alternate_executable(self, executable, options): + if options.get('gui', False) and self._is_nt: # pragma: no cover + dn, fn = os.path.split(executable) + fn = fn.replace('python', 'pythonw') + executable = os.path.join(dn, fn) + return executable + + if sys.platform.startswith('java'): # pragma: no cover + def _is_shell(self, executable): + """ + Determine if the specified executable is a script + (contains a #! line) + """ + try: + with open(executable) as fp: + return fp.read(2) == '#!' + except (OSError, IOError): + logger.warning('Failed to open %s', executable) + return False + + def _fix_jython_executable(self, executable): + if self._is_shell(executable): + # Workaround for Jython is not needed on Linux systems. + import java + + if java.lang.System.getProperty('os.name') == 'Linux': + return executable + elif executable.lower().endswith('jython.exe'): + # Use wrapper exe for Jython on Windows + return executable + return '/usr/bin/env %s' % executable + + def _build_shebang(self, executable, post_interp): + """ + Build a shebang line. In the simple case (on Windows, or a shebang line + which is not too long or contains spaces) use a simple formulation for + the shebang. Otherwise, use /bin/sh as the executable, with a contrived + shebang which allows the script to run either under Python or sh, using + suitable quoting. Thanks to Harald Nordgren for his input. + + See also: http://www.in-ulm.de/~mascheck/various/shebang/#length + https://hg.mozilla.org/mozilla-central/file/tip/mach + """ + if os.name != 'posix': + simple_shebang = True + else: + # Add 3 for '#!' prefix and newline suffix. + shebang_length = len(executable) + len(post_interp) + 3 + if sys.platform == 'darwin': + max_shebang_length = 512 + else: + max_shebang_length = 127 + simple_shebang = ((b' ' not in executable) and + (shebang_length <= max_shebang_length)) + + if simple_shebang: + result = b'#!' + executable + post_interp + b'\n' + else: + result = b'#!/bin/sh\n' + result += b"'''exec' " + executable + post_interp + b' "$0" "$@"\n' + result += b"' '''" + return result + + def _get_shebang(self, encoding, post_interp=b'', options=None): + enquote = True + if self.executable: + executable = self.executable + enquote = False # assume this will be taken care of + elif not sysconfig.is_python_build(): + executable = get_executable() + elif in_venv(): # pragma: no cover + executable = os.path.join(sysconfig.get_path('scripts'), + 'python%s' % sysconfig.get_config_var('EXE')) + else: # pragma: no cover + executable = os.path.join( + sysconfig.get_config_var('BINDIR'), + 'python%s%s' % (sysconfig.get_config_var('VERSION'), + sysconfig.get_config_var('EXE'))) + if options: + executable = self._get_alternate_executable(executable, options) + + if sys.platform.startswith('java'): # pragma: no cover + executable = self._fix_jython_executable(executable) + + # Normalise case for Windows - COMMENTED OUT + # executable = os.path.normcase(executable) + # N.B. The normalising operation above has been commented out: See + # issue #124. Although paths in Windows are generally case-insensitive, + # they aren't always. For example, a path containing a ẞ (which is a + # LATIN CAPITAL LETTER SHARP S - U+1E9E) is normcased to ß (which is a + # LATIN SMALL LETTER SHARP S' - U+00DF). The two are not considered by + # Windows as equivalent in path names. + + # If the user didn't specify an executable, it may be necessary to + # cater for executable paths with spaces (not uncommon on Windows) + if enquote: + executable = _enquote_executable(executable) + # Issue #51: don't use fsencode, since we later try to + # check that the shebang is decodable using utf-8. + executable = executable.encode('utf-8') + # in case of IronPython, play safe and enable frames support + if (sys.platform == 'cli' and '-X:Frames' not in post_interp + and '-X:FullFrames' not in post_interp): # pragma: no cover + post_interp += b' -X:Frames' + shebang = self._build_shebang(executable, post_interp) + # Python parser starts to read a script using UTF-8 until + # it gets a #coding:xxx cookie. The shebang has to be the + # first line of a file, the #coding:xxx cookie cannot be + # written before. So the shebang has to be decodable from + # UTF-8. + try: + shebang.decode('utf-8') + except UnicodeDecodeError: # pragma: no cover + raise ValueError( + 'The shebang (%r) is not decodable from utf-8' % shebang) + # If the script is encoded to a custom encoding (use a + # #coding:xxx cookie), the shebang has to be decodable from + # the script encoding too. + if encoding != 'utf-8': + try: + shebang.decode(encoding) + except UnicodeDecodeError: # pragma: no cover + raise ValueError( + 'The shebang (%r) is not decodable ' + 'from the script encoding (%r)' % (shebang, encoding)) + return shebang + + def _get_script_text(self, entry): + return self.script_template % dict(module=entry.prefix, + import_name=entry.suffix.split('.')[0], + func=entry.suffix) + + manifest = _DEFAULT_MANIFEST + + def get_manifest(self, exename): + base = os.path.basename(exename) + return self.manifest % base + + def _write_script(self, names, shebang, script_bytes, filenames, ext): + use_launcher = self.add_launchers and self._is_nt + linesep = os.linesep.encode('utf-8') + if not shebang.endswith(linesep): + shebang += linesep + if not use_launcher: + script_bytes = shebang + script_bytes + else: # pragma: no cover + if ext == 'py': + launcher = self._get_launcher('t') + else: + launcher = self._get_launcher('w') + stream = BytesIO() + with ZipFile(stream, 'w') as zf: + zf.writestr('__main__.py', script_bytes) + zip_data = stream.getvalue() + script_bytes = launcher + shebang + zip_data + for name in names: + outname = os.path.join(self.target_dir, name) + if use_launcher: # pragma: no cover + n, e = os.path.splitext(outname) + if e.startswith('.py'): + outname = n + outname = '%s.exe' % outname + try: + self._fileop.write_binary_file(outname, script_bytes) + except Exception: + # Failed writing an executable - it might be in use. + logger.warning('Failed to write executable - trying to ' + 'use .deleteme logic') + dfname = '%s.deleteme' % outname + if os.path.exists(dfname): + os.remove(dfname) # Not allowed to fail here + os.rename(outname, dfname) # nor here + self._fileop.write_binary_file(outname, script_bytes) + logger.debug('Able to replace executable using ' + '.deleteme logic') + try: + os.remove(dfname) + except Exception: + pass # still in use - ignore error + else: + if self._is_nt and not outname.endswith('.' + ext): # pragma: no cover + outname = '%s.%s' % (outname, ext) + if os.path.exists(outname) and not self.clobber: + logger.warning('Skipping existing file %s', outname) + continue + self._fileop.write_binary_file(outname, script_bytes) + if self.set_mode: + self._fileop.set_executable_mode([outname]) + filenames.append(outname) + + def _make_script(self, entry, filenames, options=None): + post_interp = b'' + if options: + args = options.get('interpreter_args', []) + if args: + args = ' %s' % ' '.join(args) + post_interp = args.encode('utf-8') + shebang = self._get_shebang('utf-8', post_interp, options=options) + script = self._get_script_text(entry).encode('utf-8') + name = entry.name + scriptnames = set() + if '' in self.variants: + scriptnames.add(name) + if 'X' in self.variants: + scriptnames.add('%s%s' % (name, sys.version_info[0])) + if 'X.Y' in self.variants: + scriptnames.add('%s-%s.%s' % (name, sys.version_info[0], + sys.version_info[1])) + if options and options.get('gui', False): + ext = 'pyw' + else: + ext = 'py' + self._write_script(scriptnames, shebang, script, filenames, ext) + + def _copy_script(self, script, filenames): + adjust = False + script = os.path.join(self.source_dir, convert_path(script)) + outname = os.path.join(self.target_dir, os.path.basename(script)) + if not self.force and not self._fileop.newer(script, outname): + logger.debug('not copying %s (up-to-date)', script) + return + + # Always open the file, but ignore failures in dry-run mode -- + # that way, we'll get accurate feedback if we can read the + # script. + try: + f = open(script, 'rb') + except IOError: # pragma: no cover + if not self.dry_run: + raise + f = None + else: + first_line = f.readline() + if not first_line: # pragma: no cover + logger.warning('%s: %s is an empty file (skipping)', + self.get_command_name(), script) + return + + match = FIRST_LINE_RE.match(first_line.replace(b'\r\n', b'\n')) + if match: + adjust = True + post_interp = match.group(1) or b'' + + if not adjust: + if f: + f.close() + self._fileop.copy_file(script, outname) + if self.set_mode: + self._fileop.set_executable_mode([outname]) + filenames.append(outname) + else: + logger.info('copying and adjusting %s -> %s', script, + self.target_dir) + if not self._fileop.dry_run: + encoding, lines = detect_encoding(f.readline) + f.seek(0) + shebang = self._get_shebang(encoding, post_interp) + if b'pythonw' in first_line: # pragma: no cover + ext = 'pyw' + else: + ext = 'py' + n = os.path.basename(outname) + self._write_script([n], shebang, f.read(), filenames, ext) + if f: + f.close() + + @property + def dry_run(self): + return self._fileop.dry_run + + @dry_run.setter + def dry_run(self, value): + self._fileop.dry_run = value + + if os.name == 'nt' or (os.name == 'java' and os._name == 'nt'): # pragma: no cover + # Executable launcher support. + # Launchers are from https://bitbucket.org/vinay.sajip/simple_launcher/ + + def _get_launcher(self, kind): + if struct.calcsize('P') == 8: # 64-bit + bits = '64' + else: + bits = '32' + name = '%s%s.exe' % (kind, bits) + # Issue 31: don't hardcode an absolute package name, but + # determine it relative to the current package + distlib_package = __name__.rsplit('.', 1)[0] + resource = finder(distlib_package).find(name) + if not resource: + msg = ('Unable to find resource %s in package %s' % (name, + distlib_package)) + raise ValueError(msg) + return resource.bytes + + # Public API follows + + def make(self, specification, options=None): + """ + Make a script. + + :param specification: The specification, which is either a valid export + entry specification (to make a script from a + callable) or a filename (to make a script by + copying from a source location). + :param options: A dictionary of options controlling script generation. + :return: A list of all absolute pathnames written to. + """ + filenames = [] + entry = get_export_entry(specification) + if entry is None: + self._copy_script(specification, filenames) + else: + self._make_script(entry, filenames, options=options) + return filenames + + def make_multiple(self, specifications, options=None): + """ + Take a list of specifications and make scripts from them, + :param specifications: A list of specifications. + :return: A list of all absolute pathnames written to, + """ + filenames = [] + for specification in specifications: + filenames.extend(self.make(specification, options)) + return filenames diff --git a/cres/venv/lib/python3.8/site-packages/distlib/util.py b/cres/venv/lib/python3.8/site-packages/distlib/util.py new file mode 100644 index 000000000..01324eae4 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/distlib/util.py @@ -0,0 +1,1761 @@ +# +# Copyright (C) 2012-2017 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +import codecs +from collections import deque +import contextlib +import csv +from glob import iglob as std_iglob +import io +import json +import logging +import os +import py_compile +import re +import socket +try: + import ssl +except ImportError: # pragma: no cover + ssl = None +import subprocess +import sys +import tarfile +import tempfile +import textwrap + +try: + import threading +except ImportError: # pragma: no cover + import dummy_threading as threading +import time + +from . import DistlibException +from .compat import (string_types, text_type, shutil, raw_input, StringIO, + cache_from_source, urlopen, urljoin, httplib, xmlrpclib, + splittype, HTTPHandler, BaseConfigurator, valid_ident, + Container, configparser, URLError, ZipFile, fsdecode, + unquote, urlparse) + +logger = logging.getLogger(__name__) + +# +# Requirement parsing code as per PEP 508 +# + +IDENTIFIER = re.compile(r'^([\w\.-]+)\s*') +VERSION_IDENTIFIER = re.compile(r'^([\w\.*+-]+)\s*') +COMPARE_OP = re.compile(r'^(<=?|>=?|={2,3}|[~!]=)\s*') +MARKER_OP = re.compile(r'^((<=?)|(>=?)|={2,3}|[~!]=|in|not\s+in)\s*') +OR = re.compile(r'^or\b\s*') +AND = re.compile(r'^and\b\s*') +NON_SPACE = re.compile(r'(\S+)\s*') +STRING_CHUNK = re.compile(r'([\s\w\.{}()*+#:;,/?!~`@$%^&=|<>\[\]-]+)') + + +def parse_marker(marker_string): + """ + Parse a marker string and return a dictionary containing a marker expression. + + The dictionary will contain keys "op", "lhs" and "rhs" for non-terminals in + the expression grammar, or strings. A string contained in quotes is to be + interpreted as a literal string, and a string not contained in quotes is a + variable (such as os_name). + """ + def marker_var(remaining): + # either identifier, or literal string + m = IDENTIFIER.match(remaining) + if m: + result = m.groups()[0] + remaining = remaining[m.end():] + elif not remaining: + raise SyntaxError('unexpected end of input') + else: + q = remaining[0] + if q not in '\'"': + raise SyntaxError('invalid expression: %s' % remaining) + oq = '\'"'.replace(q, '') + remaining = remaining[1:] + parts = [q] + while remaining: + # either a string chunk, or oq, or q to terminate + if remaining[0] == q: + break + elif remaining[0] == oq: + parts.append(oq) + remaining = remaining[1:] + else: + m = STRING_CHUNK.match(remaining) + if not m: + raise SyntaxError('error in string literal: %s' % remaining) + parts.append(m.groups()[0]) + remaining = remaining[m.end():] + else: + s = ''.join(parts) + raise SyntaxError('unterminated string: %s' % s) + parts.append(q) + result = ''.join(parts) + remaining = remaining[1:].lstrip() # skip past closing quote + return result, remaining + + def marker_expr(remaining): + if remaining and remaining[0] == '(': + result, remaining = marker(remaining[1:].lstrip()) + if remaining[0] != ')': + raise SyntaxError('unterminated parenthesis: %s' % remaining) + remaining = remaining[1:].lstrip() + else: + lhs, remaining = marker_var(remaining) + while remaining: + m = MARKER_OP.match(remaining) + if not m: + break + op = m.groups()[0] + remaining = remaining[m.end():] + rhs, remaining = marker_var(remaining) + lhs = {'op': op, 'lhs': lhs, 'rhs': rhs} + result = lhs + return result, remaining + + def marker_and(remaining): + lhs, remaining = marker_expr(remaining) + while remaining: + m = AND.match(remaining) + if not m: + break + remaining = remaining[m.end():] + rhs, remaining = marker_expr(remaining) + lhs = {'op': 'and', 'lhs': lhs, 'rhs': rhs} + return lhs, remaining + + def marker(remaining): + lhs, remaining = marker_and(remaining) + while remaining: + m = OR.match(remaining) + if not m: + break + remaining = remaining[m.end():] + rhs, remaining = marker_and(remaining) + lhs = {'op': 'or', 'lhs': lhs, 'rhs': rhs} + return lhs, remaining + + return marker(marker_string) + + +def parse_requirement(req): + """ + Parse a requirement passed in as a string. Return a Container + whose attributes contain the various parts of the requirement. + """ + remaining = req.strip() + if not remaining or remaining.startswith('#'): + return None + m = IDENTIFIER.match(remaining) + if not m: + raise SyntaxError('name expected: %s' % remaining) + distname = m.groups()[0] + remaining = remaining[m.end():] + extras = mark_expr = versions = uri = None + if remaining and remaining[0] == '[': + i = remaining.find(']', 1) + if i < 0: + raise SyntaxError('unterminated extra: %s' % remaining) + s = remaining[1:i] + remaining = remaining[i + 1:].lstrip() + extras = [] + while s: + m = IDENTIFIER.match(s) + if not m: + raise SyntaxError('malformed extra: %s' % s) + extras.append(m.groups()[0]) + s = s[m.end():] + if not s: + break + if s[0] != ',': + raise SyntaxError('comma expected in extras: %s' % s) + s = s[1:].lstrip() + if not extras: + extras = None + if remaining: + if remaining[0] == '@': + # it's a URI + remaining = remaining[1:].lstrip() + m = NON_SPACE.match(remaining) + if not m: + raise SyntaxError('invalid URI: %s' % remaining) + uri = m.groups()[0] + t = urlparse(uri) + # there are issues with Python and URL parsing, so this test + # is a bit crude. See bpo-20271, bpo-23505. Python doesn't + # always parse invalid URLs correctly - it should raise + # exceptions for malformed URLs + if not (t.scheme and t.netloc): + raise SyntaxError('Invalid URL: %s' % uri) + remaining = remaining[m.end():].lstrip() + else: + + def get_versions(ver_remaining): + """ + Return a list of operator, version tuples if any are + specified, else None. + """ + m = COMPARE_OP.match(ver_remaining) + versions = None + if m: + versions = [] + while True: + op = m.groups()[0] + ver_remaining = ver_remaining[m.end():] + m = VERSION_IDENTIFIER.match(ver_remaining) + if not m: + raise SyntaxError('invalid version: %s' % ver_remaining) + v = m.groups()[0] + versions.append((op, v)) + ver_remaining = ver_remaining[m.end():] + if not ver_remaining or ver_remaining[0] != ',': + break + ver_remaining = ver_remaining[1:].lstrip() + m = COMPARE_OP.match(ver_remaining) + if not m: + raise SyntaxError('invalid constraint: %s' % ver_remaining) + if not versions: + versions = None + return versions, ver_remaining + + if remaining[0] != '(': + versions, remaining = get_versions(remaining) + else: + i = remaining.find(')', 1) + if i < 0: + raise SyntaxError('unterminated parenthesis: %s' % remaining) + s = remaining[1:i] + remaining = remaining[i + 1:].lstrip() + # As a special diversion from PEP 508, allow a version number + # a.b.c in parentheses as a synonym for ~= a.b.c (because this + # is allowed in earlier PEPs) + if COMPARE_OP.match(s): + versions, _ = get_versions(s) + else: + m = VERSION_IDENTIFIER.match(s) + if not m: + raise SyntaxError('invalid constraint: %s' % s) + v = m.groups()[0] + s = s[m.end():].lstrip() + if s: + raise SyntaxError('invalid constraint: %s' % s) + versions = [('~=', v)] + + if remaining: + if remaining[0] != ';': + raise SyntaxError('invalid requirement: %s' % remaining) + remaining = remaining[1:].lstrip() + + mark_expr, remaining = parse_marker(remaining) + + if remaining and remaining[0] != '#': + raise SyntaxError('unexpected trailing data: %s' % remaining) + + if not versions: + rs = distname + else: + rs = '%s %s' % (distname, ', '.join(['%s %s' % con for con in versions])) + return Container(name=distname, extras=extras, constraints=versions, + marker=mark_expr, url=uri, requirement=rs) + + +def get_resources_dests(resources_root, rules): + """Find destinations for resources files""" + + def get_rel_path(root, path): + # normalizes and returns a lstripped-/-separated path + root = root.replace(os.path.sep, '/') + path = path.replace(os.path.sep, '/') + assert path.startswith(root) + return path[len(root):].lstrip('/') + + destinations = {} + for base, suffix, dest in rules: + prefix = os.path.join(resources_root, base) + for abs_base in iglob(prefix): + abs_glob = os.path.join(abs_base, suffix) + for abs_path in iglob(abs_glob): + resource_file = get_rel_path(resources_root, abs_path) + if dest is None: # remove the entry if it was here + destinations.pop(resource_file, None) + else: + rel_path = get_rel_path(abs_base, abs_path) + rel_dest = dest.replace(os.path.sep, '/').rstrip('/') + destinations[resource_file] = rel_dest + '/' + rel_path + return destinations + + +def in_venv(): + if hasattr(sys, 'real_prefix'): + # virtualenv venvs + result = True + else: + # PEP 405 venvs + result = sys.prefix != getattr(sys, 'base_prefix', sys.prefix) + return result + + +def get_executable(): +# The __PYVENV_LAUNCHER__ dance is apparently no longer needed, as +# changes to the stub launcher mean that sys.executable always points +# to the stub on OS X +# if sys.platform == 'darwin' and ('__PYVENV_LAUNCHER__' +# in os.environ): +# result = os.environ['__PYVENV_LAUNCHER__'] +# else: +# result = sys.executable +# return result + result = os.path.normcase(sys.executable) + if not isinstance(result, text_type): + result = fsdecode(result) + return result + + +def proceed(prompt, allowed_chars, error_prompt=None, default=None): + p = prompt + while True: + s = raw_input(p) + p = prompt + if not s and default: + s = default + if s: + c = s[0].lower() + if c in allowed_chars: + break + if error_prompt: + p = '%c: %s\n%s' % (c, error_prompt, prompt) + return c + + +def extract_by_key(d, keys): + if isinstance(keys, string_types): + keys = keys.split() + result = {} + for key in keys: + if key in d: + result[key] = d[key] + return result + +def read_exports(stream): + if sys.version_info[0] >= 3: + # needs to be a text stream + stream = codecs.getreader('utf-8')(stream) + # Try to load as JSON, falling back on legacy format + data = stream.read() + stream = StringIO(data) + try: + jdata = json.load(stream) + result = jdata['extensions']['python.exports']['exports'] + for group, entries in result.items(): + for k, v in entries.items(): + s = '%s = %s' % (k, v) + entry = get_export_entry(s) + assert entry is not None + entries[k] = entry + return result + except Exception: + stream.seek(0, 0) + + def read_stream(cp, stream): + if hasattr(cp, 'read_file'): + cp.read_file(stream) + else: + cp.readfp(stream) + + cp = configparser.ConfigParser() + try: + read_stream(cp, stream) + except configparser.MissingSectionHeaderError: + stream.close() + data = textwrap.dedent(data) + stream = StringIO(data) + read_stream(cp, stream) + + result = {} + for key in cp.sections(): + result[key] = entries = {} + for name, value in cp.items(key): + s = '%s = %s' % (name, value) + entry = get_export_entry(s) + assert entry is not None + #entry.dist = self + entries[name] = entry + return result + + +def write_exports(exports, stream): + if sys.version_info[0] >= 3: + # needs to be a text stream + stream = codecs.getwriter('utf-8')(stream) + cp = configparser.ConfigParser() + for k, v in exports.items(): + # TODO check k, v for valid values + cp.add_section(k) + for entry in v.values(): + if entry.suffix is None: + s = entry.prefix + else: + s = '%s:%s' % (entry.prefix, entry.suffix) + if entry.flags: + s = '%s [%s]' % (s, ', '.join(entry.flags)) + cp.set(k, entry.name, s) + cp.write(stream) + + +@contextlib.contextmanager +def tempdir(): + td = tempfile.mkdtemp() + try: + yield td + finally: + shutil.rmtree(td) + +@contextlib.contextmanager +def chdir(d): + cwd = os.getcwd() + try: + os.chdir(d) + yield + finally: + os.chdir(cwd) + + +@contextlib.contextmanager +def socket_timeout(seconds=15): + cto = socket.getdefaulttimeout() + try: + socket.setdefaulttimeout(seconds) + yield + finally: + socket.setdefaulttimeout(cto) + + +class cached_property(object): + def __init__(self, func): + self.func = func + #for attr in ('__name__', '__module__', '__doc__'): + # setattr(self, attr, getattr(func, attr, None)) + + def __get__(self, obj, cls=None): + if obj is None: + return self + value = self.func(obj) + object.__setattr__(obj, self.func.__name__, value) + #obj.__dict__[self.func.__name__] = value = self.func(obj) + return value + +def convert_path(pathname): + """Return 'pathname' as a name that will work on the native filesystem. + + The path is split on '/' and put back together again using the current + directory separator. Needed because filenames in the setup script are + always supplied in Unix style, and have to be converted to the local + convention before we can actually use them in the filesystem. Raises + ValueError on non-Unix-ish systems if 'pathname' either starts or + ends with a slash. + """ + if os.sep == '/': + return pathname + if not pathname: + return pathname + if pathname[0] == '/': + raise ValueError("path '%s' cannot be absolute" % pathname) + if pathname[-1] == '/': + raise ValueError("path '%s' cannot end with '/'" % pathname) + + paths = pathname.split('/') + while os.curdir in paths: + paths.remove(os.curdir) + if not paths: + return os.curdir + return os.path.join(*paths) + + +class FileOperator(object): + def __init__(self, dry_run=False): + self.dry_run = dry_run + self.ensured = set() + self._init_record() + + def _init_record(self): + self.record = False + self.files_written = set() + self.dirs_created = set() + + def record_as_written(self, path): + if self.record: + self.files_written.add(path) + + def newer(self, source, target): + """Tell if the target is newer than the source. + + Returns true if 'source' exists and is more recently modified than + 'target', or if 'source' exists and 'target' doesn't. + + Returns false if both exist and 'target' is the same age or younger + than 'source'. Raise PackagingFileError if 'source' does not exist. + + Note that this test is not very accurate: files created in the same + second will have the same "age". + """ + if not os.path.exists(source): + raise DistlibException("file '%r' does not exist" % + os.path.abspath(source)) + if not os.path.exists(target): + return True + + return os.stat(source).st_mtime > os.stat(target).st_mtime + + def copy_file(self, infile, outfile, check=True): + """Copy a file respecting dry-run and force flags. + """ + self.ensure_dir(os.path.dirname(outfile)) + logger.info('Copying %s to %s', infile, outfile) + if not self.dry_run: + msg = None + if check: + if os.path.islink(outfile): + msg = '%s is a symlink' % outfile + elif os.path.exists(outfile) and not os.path.isfile(outfile): + msg = '%s is a non-regular file' % outfile + if msg: + raise ValueError(msg + ' which would be overwritten') + shutil.copyfile(infile, outfile) + self.record_as_written(outfile) + + def copy_stream(self, instream, outfile, encoding=None): + assert not os.path.isdir(outfile) + self.ensure_dir(os.path.dirname(outfile)) + logger.info('Copying stream %s to %s', instream, outfile) + if not self.dry_run: + if encoding is None: + outstream = open(outfile, 'wb') + else: + outstream = codecs.open(outfile, 'w', encoding=encoding) + try: + shutil.copyfileobj(instream, outstream) + finally: + outstream.close() + self.record_as_written(outfile) + + def write_binary_file(self, path, data): + self.ensure_dir(os.path.dirname(path)) + if not self.dry_run: + if os.path.exists(path): + os.remove(path) + with open(path, 'wb') as f: + f.write(data) + self.record_as_written(path) + + def write_text_file(self, path, data, encoding): + self.write_binary_file(path, data.encode(encoding)) + + def set_mode(self, bits, mask, files): + if os.name == 'posix' or (os.name == 'java' and os._name == 'posix'): + # Set the executable bits (owner, group, and world) on + # all the files specified. + for f in files: + if self.dry_run: + logger.info("changing mode of %s", f) + else: + mode = (os.stat(f).st_mode | bits) & mask + logger.info("changing mode of %s to %o", f, mode) + os.chmod(f, mode) + + set_executable_mode = lambda s, f: s.set_mode(0o555, 0o7777, f) + + def ensure_dir(self, path): + path = os.path.abspath(path) + if path not in self.ensured and not os.path.exists(path): + self.ensured.add(path) + d, f = os.path.split(path) + self.ensure_dir(d) + logger.info('Creating %s' % path) + if not self.dry_run: + os.mkdir(path) + if self.record: + self.dirs_created.add(path) + + def byte_compile(self, path, optimize=False, force=False, prefix=None, hashed_invalidation=False): + dpath = cache_from_source(path, not optimize) + logger.info('Byte-compiling %s to %s', path, dpath) + if not self.dry_run: + if force or self.newer(path, dpath): + if not prefix: + diagpath = None + else: + assert path.startswith(prefix) + diagpath = path[len(prefix):] + compile_kwargs = {} + if hashed_invalidation and hasattr(py_compile, 'PycInvalidationMode'): + compile_kwargs['invalidation_mode'] = py_compile.PycInvalidationMode.CHECKED_HASH + py_compile.compile(path, dpath, diagpath, True, **compile_kwargs) # raise error + self.record_as_written(dpath) + return dpath + + def ensure_removed(self, path): + if os.path.exists(path): + if os.path.isdir(path) and not os.path.islink(path): + logger.debug('Removing directory tree at %s', path) + if not self.dry_run: + shutil.rmtree(path) + if self.record: + if path in self.dirs_created: + self.dirs_created.remove(path) + else: + if os.path.islink(path): + s = 'link' + else: + s = 'file' + logger.debug('Removing %s %s', s, path) + if not self.dry_run: + os.remove(path) + if self.record: + if path in self.files_written: + self.files_written.remove(path) + + def is_writable(self, path): + result = False + while not result: + if os.path.exists(path): + result = os.access(path, os.W_OK) + break + parent = os.path.dirname(path) + if parent == path: + break + path = parent + return result + + def commit(self): + """ + Commit recorded changes, turn off recording, return + changes. + """ + assert self.record + result = self.files_written, self.dirs_created + self._init_record() + return result + + def rollback(self): + if not self.dry_run: + for f in list(self.files_written): + if os.path.exists(f): + os.remove(f) + # dirs should all be empty now, except perhaps for + # __pycache__ subdirs + # reverse so that subdirs appear before their parents + dirs = sorted(self.dirs_created, reverse=True) + for d in dirs: + flist = os.listdir(d) + if flist: + assert flist == ['__pycache__'] + sd = os.path.join(d, flist[0]) + os.rmdir(sd) + os.rmdir(d) # should fail if non-empty + self._init_record() + +def resolve(module_name, dotted_path): + if module_name in sys.modules: + mod = sys.modules[module_name] + else: + mod = __import__(module_name) + if dotted_path is None: + result = mod + else: + parts = dotted_path.split('.') + result = getattr(mod, parts.pop(0)) + for p in parts: + result = getattr(result, p) + return result + + +class ExportEntry(object): + def __init__(self, name, prefix, suffix, flags): + self.name = name + self.prefix = prefix + self.suffix = suffix + self.flags = flags + + @cached_property + def value(self): + return resolve(self.prefix, self.suffix) + + def __repr__(self): # pragma: no cover + return '' % (self.name, self.prefix, + self.suffix, self.flags) + + def __eq__(self, other): + if not isinstance(other, ExportEntry): + result = False + else: + result = (self.name == other.name and + self.prefix == other.prefix and + self.suffix == other.suffix and + self.flags == other.flags) + return result + + __hash__ = object.__hash__ + + +ENTRY_RE = re.compile(r'''(?P(\w|[-.+])+) + \s*=\s*(?P(\w+)([:\.]\w+)*) + \s*(\[\s*(?P[\w-]+(=\w+)?(,\s*\w+(=\w+)?)*)\s*\])? + ''', re.VERBOSE) + +def get_export_entry(specification): + m = ENTRY_RE.search(specification) + if not m: + result = None + if '[' in specification or ']' in specification: + raise DistlibException("Invalid specification " + "'%s'" % specification) + else: + d = m.groupdict() + name = d['name'] + path = d['callable'] + colons = path.count(':') + if colons == 0: + prefix, suffix = path, None + else: + if colons != 1: + raise DistlibException("Invalid specification " + "'%s'" % specification) + prefix, suffix = path.split(':') + flags = d['flags'] + if flags is None: + if '[' in specification or ']' in specification: + raise DistlibException("Invalid specification " + "'%s'" % specification) + flags = [] + else: + flags = [f.strip() for f in flags.split(',')] + result = ExportEntry(name, prefix, suffix, flags) + return result + + +def get_cache_base(suffix=None): + """ + Return the default base location for distlib caches. If the directory does + not exist, it is created. Use the suffix provided for the base directory, + and default to '.distlib' if it isn't provided. + + On Windows, if LOCALAPPDATA is defined in the environment, then it is + assumed to be a directory, and will be the parent directory of the result. + On POSIX, and on Windows if LOCALAPPDATA is not defined, the user's home + directory - using os.expanduser('~') - will be the parent directory of + the result. + + The result is just the directory '.distlib' in the parent directory as + determined above, or with the name specified with ``suffix``. + """ + if suffix is None: + suffix = '.distlib' + if os.name == 'nt' and 'LOCALAPPDATA' in os.environ: + result = os.path.expandvars('$localappdata') + else: + # Assume posix, or old Windows + result = os.path.expanduser('~') + # we use 'isdir' instead of 'exists', because we want to + # fail if there's a file with that name + if os.path.isdir(result): + usable = os.access(result, os.W_OK) + if not usable: + logger.warning('Directory exists but is not writable: %s', result) + else: + try: + os.makedirs(result) + usable = True + except OSError: + logger.warning('Unable to create %s', result, exc_info=True) + usable = False + if not usable: + result = tempfile.mkdtemp() + logger.warning('Default location unusable, using %s', result) + return os.path.join(result, suffix) + + +def path_to_cache_dir(path): + """ + Convert an absolute path to a directory name for use in a cache. + + The algorithm used is: + + #. On Windows, any ``':'`` in the drive is replaced with ``'---'``. + #. Any occurrence of ``os.sep`` is replaced with ``'--'``. + #. ``'.cache'`` is appended. + """ + d, p = os.path.splitdrive(os.path.abspath(path)) + if d: + d = d.replace(':', '---') + p = p.replace(os.sep, '--') + return d + p + '.cache' + + +def ensure_slash(s): + if not s.endswith('/'): + return s + '/' + return s + + +def parse_credentials(netloc): + username = password = None + if '@' in netloc: + prefix, netloc = netloc.rsplit('@', 1) + if ':' not in prefix: + username = prefix + else: + username, password = prefix.split(':', 1) + if username: + username = unquote(username) + if password: + password = unquote(password) + return username, password, netloc + + +def get_process_umask(): + result = os.umask(0o22) + os.umask(result) + return result + +def is_string_sequence(seq): + result = True + i = None + for i, s in enumerate(seq): + if not isinstance(s, string_types): + result = False + break + assert i is not None + return result + +PROJECT_NAME_AND_VERSION = re.compile('([a-z0-9_]+([.-][a-z_][a-z0-9_]*)*)-' + '([a-z0-9_.+-]+)', re.I) +PYTHON_VERSION = re.compile(r'-py(\d\.?\d?)') + + +def split_filename(filename, project_name=None): + """ + Extract name, version, python version from a filename (no extension) + + Return name, version, pyver or None + """ + result = None + pyver = None + filename = unquote(filename).replace(' ', '-') + m = PYTHON_VERSION.search(filename) + if m: + pyver = m.group(1) + filename = filename[:m.start()] + if project_name and len(filename) > len(project_name) + 1: + m = re.match(re.escape(project_name) + r'\b', filename) + if m: + n = m.end() + result = filename[:n], filename[n + 1:], pyver + if result is None: + m = PROJECT_NAME_AND_VERSION.match(filename) + if m: + result = m.group(1), m.group(3), pyver + return result + +# Allow spaces in name because of legacy dists like "Twisted Core" +NAME_VERSION_RE = re.compile(r'(?P[\w .-]+)\s*' + r'\(\s*(?P[^\s)]+)\)$') + +def parse_name_and_version(p): + """ + A utility method used to get name and version from a string. + + From e.g. a Provides-Dist value. + + :param p: A value in a form 'foo (1.0)' + :return: The name and version as a tuple. + """ + m = NAME_VERSION_RE.match(p) + if not m: + raise DistlibException('Ill-formed name/version string: \'%s\'' % p) + d = m.groupdict() + return d['name'].strip().lower(), d['ver'] + +def get_extras(requested, available): + result = set() + requested = set(requested or []) + available = set(available or []) + if '*' in requested: + requested.remove('*') + result |= available + for r in requested: + if r == '-': + result.add(r) + elif r.startswith('-'): + unwanted = r[1:] + if unwanted not in available: + logger.warning('undeclared extra: %s' % unwanted) + if unwanted in result: + result.remove(unwanted) + else: + if r not in available: + logger.warning('undeclared extra: %s' % r) + result.add(r) + return result +# +# Extended metadata functionality +# + +def _get_external_data(url): + result = {} + try: + # urlopen might fail if it runs into redirections, + # because of Python issue #13696. Fixed in locators + # using a custom redirect handler. + resp = urlopen(url) + headers = resp.info() + ct = headers.get('Content-Type') + if not ct.startswith('application/json'): + logger.debug('Unexpected response for JSON request: %s', ct) + else: + reader = codecs.getreader('utf-8')(resp) + #data = reader.read().decode('utf-8') + #result = json.loads(data) + result = json.load(reader) + except Exception as e: + logger.exception('Failed to get external data for %s: %s', url, e) + return result + +_external_data_base_url = 'https://www.red-dove.com/pypi/projects/' + +def get_project_data(name): + url = '%s/%s/project.json' % (name[0].upper(), name) + url = urljoin(_external_data_base_url, url) + result = _get_external_data(url) + return result + +def get_package_data(name, version): + url = '%s/%s/package-%s.json' % (name[0].upper(), name, version) + url = urljoin(_external_data_base_url, url) + return _get_external_data(url) + + +class Cache(object): + """ + A class implementing a cache for resources that need to live in the file system + e.g. shared libraries. This class was moved from resources to here because it + could be used by other modules, e.g. the wheel module. + """ + + def __init__(self, base): + """ + Initialise an instance. + + :param base: The base directory where the cache should be located. + """ + # we use 'isdir' instead of 'exists', because we want to + # fail if there's a file with that name + if not os.path.isdir(base): # pragma: no cover + os.makedirs(base) + if (os.stat(base).st_mode & 0o77) != 0: + logger.warning('Directory \'%s\' is not private', base) + self.base = os.path.abspath(os.path.normpath(base)) + + def prefix_to_dir(self, prefix): + """ + Converts a resource prefix to a directory name in the cache. + """ + return path_to_cache_dir(prefix) + + def clear(self): + """ + Clear the cache. + """ + not_removed = [] + for fn in os.listdir(self.base): + fn = os.path.join(self.base, fn) + try: + if os.path.islink(fn) or os.path.isfile(fn): + os.remove(fn) + elif os.path.isdir(fn): + shutil.rmtree(fn) + except Exception: + not_removed.append(fn) + return not_removed + + +class EventMixin(object): + """ + A very simple publish/subscribe system. + """ + def __init__(self): + self._subscribers = {} + + def add(self, event, subscriber, append=True): + """ + Add a subscriber for an event. + + :param event: The name of an event. + :param subscriber: The subscriber to be added (and called when the + event is published). + :param append: Whether to append or prepend the subscriber to an + existing subscriber list for the event. + """ + subs = self._subscribers + if event not in subs: + subs[event] = deque([subscriber]) + else: + sq = subs[event] + if append: + sq.append(subscriber) + else: + sq.appendleft(subscriber) + + def remove(self, event, subscriber): + """ + Remove a subscriber for an event. + + :param event: The name of an event. + :param subscriber: The subscriber to be removed. + """ + subs = self._subscribers + if event not in subs: + raise ValueError('No subscribers: %r' % event) + subs[event].remove(subscriber) + + def get_subscribers(self, event): + """ + Return an iterator for the subscribers for an event. + :param event: The event to return subscribers for. + """ + return iter(self._subscribers.get(event, ())) + + def publish(self, event, *args, **kwargs): + """ + Publish a event and return a list of values returned by its + subscribers. + + :param event: The event to publish. + :param args: The positional arguments to pass to the event's + subscribers. + :param kwargs: The keyword arguments to pass to the event's + subscribers. + """ + result = [] + for subscriber in self.get_subscribers(event): + try: + value = subscriber(event, *args, **kwargs) + except Exception: + logger.exception('Exception during event publication') + value = None + result.append(value) + logger.debug('publish %s: args = %s, kwargs = %s, result = %s', + event, args, kwargs, result) + return result + +# +# Simple sequencing +# +class Sequencer(object): + def __init__(self): + self._preds = {} + self._succs = {} + self._nodes = set() # nodes with no preds/succs + + def add_node(self, node): + self._nodes.add(node) + + def remove_node(self, node, edges=False): + if node in self._nodes: + self._nodes.remove(node) + if edges: + for p in set(self._preds.get(node, ())): + self.remove(p, node) + for s in set(self._succs.get(node, ())): + self.remove(node, s) + # Remove empties + for k, v in list(self._preds.items()): + if not v: + del self._preds[k] + for k, v in list(self._succs.items()): + if not v: + del self._succs[k] + + def add(self, pred, succ): + assert pred != succ + self._preds.setdefault(succ, set()).add(pred) + self._succs.setdefault(pred, set()).add(succ) + + def remove(self, pred, succ): + assert pred != succ + try: + preds = self._preds[succ] + succs = self._succs[pred] + except KeyError: # pragma: no cover + raise ValueError('%r not a successor of anything' % succ) + try: + preds.remove(pred) + succs.remove(succ) + except KeyError: # pragma: no cover + raise ValueError('%r not a successor of %r' % (succ, pred)) + + def is_step(self, step): + return (step in self._preds or step in self._succs or + step in self._nodes) + + def get_steps(self, final): + if not self.is_step(final): + raise ValueError('Unknown: %r' % final) + result = [] + todo = [] + seen = set() + todo.append(final) + while todo: + step = todo.pop(0) + if step in seen: + # if a step was already seen, + # move it to the end (so it will appear earlier + # when reversed on return) ... but not for the + # final step, as that would be confusing for + # users + if step != final: + result.remove(step) + result.append(step) + else: + seen.add(step) + result.append(step) + preds = self._preds.get(step, ()) + todo.extend(preds) + return reversed(result) + + @property + def strong_connections(self): + #http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm + index_counter = [0] + stack = [] + lowlinks = {} + index = {} + result = [] + + graph = self._succs + + def strongconnect(node): + # set the depth index for this node to the smallest unused index + index[node] = index_counter[0] + lowlinks[node] = index_counter[0] + index_counter[0] += 1 + stack.append(node) + + # Consider successors + try: + successors = graph[node] + except Exception: + successors = [] + for successor in successors: + if successor not in lowlinks: + # Successor has not yet been visited + strongconnect(successor) + lowlinks[node] = min(lowlinks[node],lowlinks[successor]) + elif successor in stack: + # the successor is in the stack and hence in the current + # strongly connected component (SCC) + lowlinks[node] = min(lowlinks[node],index[successor]) + + # If `node` is a root node, pop the stack and generate an SCC + if lowlinks[node] == index[node]: + connected_component = [] + + while True: + successor = stack.pop() + connected_component.append(successor) + if successor == node: break + component = tuple(connected_component) + # storing the result + result.append(component) + + for node in graph: + if node not in lowlinks: + strongconnect(node) + + return result + + @property + def dot(self): + result = ['digraph G {'] + for succ in self._preds: + preds = self._preds[succ] + for pred in preds: + result.append(' %s -> %s;' % (pred, succ)) + for node in self._nodes: + result.append(' %s;' % node) + result.append('}') + return '\n'.join(result) + +# +# Unarchiving functionality for zip, tar, tgz, tbz, whl +# + +ARCHIVE_EXTENSIONS = ('.tar.gz', '.tar.bz2', '.tar', '.zip', + '.tgz', '.tbz', '.whl') + +def unarchive(archive_filename, dest_dir, format=None, check=True): + + def check_path(path): + if not isinstance(path, text_type): + path = path.decode('utf-8') + p = os.path.abspath(os.path.join(dest_dir, path)) + if not p.startswith(dest_dir) or p[plen] != os.sep: + raise ValueError('path outside destination: %r' % p) + + dest_dir = os.path.abspath(dest_dir) + plen = len(dest_dir) + archive = None + if format is None: + if archive_filename.endswith(('.zip', '.whl')): + format = 'zip' + elif archive_filename.endswith(('.tar.gz', '.tgz')): + format = 'tgz' + mode = 'r:gz' + elif archive_filename.endswith(('.tar.bz2', '.tbz')): + format = 'tbz' + mode = 'r:bz2' + elif archive_filename.endswith('.tar'): + format = 'tar' + mode = 'r' + else: # pragma: no cover + raise ValueError('Unknown format for %r' % archive_filename) + try: + if format == 'zip': + archive = ZipFile(archive_filename, 'r') + if check: + names = archive.namelist() + for name in names: + check_path(name) + else: + archive = tarfile.open(archive_filename, mode) + if check: + names = archive.getnames() + for name in names: + check_path(name) + if format != 'zip' and sys.version_info[0] < 3: + # See Python issue 17153. If the dest path contains Unicode, + # tarfile extraction fails on Python 2.x if a member path name + # contains non-ASCII characters - it leads to an implicit + # bytes -> unicode conversion using ASCII to decode. + for tarinfo in archive.getmembers(): + if not isinstance(tarinfo.name, text_type): + tarinfo.name = tarinfo.name.decode('utf-8') + archive.extractall(dest_dir) + + finally: + if archive: + archive.close() + + +def zip_dir(directory): + """zip a directory tree into a BytesIO object""" + result = io.BytesIO() + dlen = len(directory) + with ZipFile(result, "w") as zf: + for root, dirs, files in os.walk(directory): + for name in files: + full = os.path.join(root, name) + rel = root[dlen:] + dest = os.path.join(rel, name) + zf.write(full, dest) + return result + +# +# Simple progress bar +# + +UNITS = ('', 'K', 'M', 'G','T','P') + + +class Progress(object): + unknown = 'UNKNOWN' + + def __init__(self, minval=0, maxval=100): + assert maxval is None or maxval >= minval + self.min = self.cur = minval + self.max = maxval + self.started = None + self.elapsed = 0 + self.done = False + + def update(self, curval): + assert self.min <= curval + assert self.max is None or curval <= self.max + self.cur = curval + now = time.time() + if self.started is None: + self.started = now + else: + self.elapsed = now - self.started + + def increment(self, incr): + assert incr >= 0 + self.update(self.cur + incr) + + def start(self): + self.update(self.min) + return self + + def stop(self): + if self.max is not None: + self.update(self.max) + self.done = True + + @property + def maximum(self): + return self.unknown if self.max is None else self.max + + @property + def percentage(self): + if self.done: + result = '100 %' + elif self.max is None: + result = ' ?? %' + else: + v = 100.0 * (self.cur - self.min) / (self.max - self.min) + result = '%3d %%' % v + return result + + def format_duration(self, duration): + if (duration <= 0) and self.max is None or self.cur == self.min: + result = '??:??:??' + #elif duration < 1: + # result = '--:--:--' + else: + result = time.strftime('%H:%M:%S', time.gmtime(duration)) + return result + + @property + def ETA(self): + if self.done: + prefix = 'Done' + t = self.elapsed + #import pdb; pdb.set_trace() + else: + prefix = 'ETA ' + if self.max is None: + t = -1 + elif self.elapsed == 0 or (self.cur == self.min): + t = 0 + else: + #import pdb; pdb.set_trace() + t = float(self.max - self.min) + t /= self.cur - self.min + t = (t - 1) * self.elapsed + return '%s: %s' % (prefix, self.format_duration(t)) + + @property + def speed(self): + if self.elapsed == 0: + result = 0.0 + else: + result = (self.cur - self.min) / self.elapsed + for unit in UNITS: + if result < 1000: + break + result /= 1000.0 + return '%d %sB/s' % (result, unit) + +# +# Glob functionality +# + +RICH_GLOB = re.compile(r'\{([^}]*)\}') +_CHECK_RECURSIVE_GLOB = re.compile(r'[^/\\,{]\*\*|\*\*[^/\\,}]') +_CHECK_MISMATCH_SET = re.compile(r'^[^{]*\}|\{[^}]*$') + + +def iglob(path_glob): + """Extended globbing function that supports ** and {opt1,opt2,opt3}.""" + if _CHECK_RECURSIVE_GLOB.search(path_glob): + msg = """invalid glob %r: recursive glob "**" must be used alone""" + raise ValueError(msg % path_glob) + if _CHECK_MISMATCH_SET.search(path_glob): + msg = """invalid glob %r: mismatching set marker '{' or '}'""" + raise ValueError(msg % path_glob) + return _iglob(path_glob) + + +def _iglob(path_glob): + rich_path_glob = RICH_GLOB.split(path_glob, 1) + if len(rich_path_glob) > 1: + assert len(rich_path_glob) == 3, rich_path_glob + prefix, set, suffix = rich_path_glob + for item in set.split(','): + for path in _iglob(''.join((prefix, item, suffix))): + yield path + else: + if '**' not in path_glob: + for item in std_iglob(path_glob): + yield item + else: + prefix, radical = path_glob.split('**', 1) + if prefix == '': + prefix = '.' + if radical == '': + radical = '*' + else: + # we support both + radical = radical.lstrip('/') + radical = radical.lstrip('\\') + for path, dir, files in os.walk(prefix): + path = os.path.normpath(path) + for fn in _iglob(os.path.join(path, radical)): + yield fn + +if ssl: + from .compat import (HTTPSHandler as BaseHTTPSHandler, match_hostname, + CertificateError) + + +# +# HTTPSConnection which verifies certificates/matches domains +# + + class HTTPSConnection(httplib.HTTPSConnection): + ca_certs = None # set this to the path to the certs file (.pem) + check_domain = True # only used if ca_certs is not None + + # noinspection PyPropertyAccess + def connect(self): + sock = socket.create_connection((self.host, self.port), self.timeout) + if getattr(self, '_tunnel_host', False): + self.sock = sock + self._tunnel() + + if not hasattr(ssl, 'SSLContext'): + # For 2.x + if self.ca_certs: + cert_reqs = ssl.CERT_REQUIRED + else: + cert_reqs = ssl.CERT_NONE + self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, + cert_reqs=cert_reqs, + ssl_version=ssl.PROTOCOL_SSLv23, + ca_certs=self.ca_certs) + else: # pragma: no cover + context = ssl.SSLContext(ssl.PROTOCOL_SSLv23) + if hasattr(ssl, 'OP_NO_SSLv2'): + context.options |= ssl.OP_NO_SSLv2 + if self.cert_file: + context.load_cert_chain(self.cert_file, self.key_file) + kwargs = {} + if self.ca_certs: + context.verify_mode = ssl.CERT_REQUIRED + context.load_verify_locations(cafile=self.ca_certs) + if getattr(ssl, 'HAS_SNI', False): + kwargs['server_hostname'] = self.host + self.sock = context.wrap_socket(sock, **kwargs) + if self.ca_certs and self.check_domain: + try: + match_hostname(self.sock.getpeercert(), self.host) + logger.debug('Host verified: %s', self.host) + except CertificateError: # pragma: no cover + self.sock.shutdown(socket.SHUT_RDWR) + self.sock.close() + raise + + class HTTPSHandler(BaseHTTPSHandler): + def __init__(self, ca_certs, check_domain=True): + BaseHTTPSHandler.__init__(self) + self.ca_certs = ca_certs + self.check_domain = check_domain + + def _conn_maker(self, *args, **kwargs): + """ + This is called to create a connection instance. Normally you'd + pass a connection class to do_open, but it doesn't actually check for + a class, and just expects a callable. As long as we behave just as a + constructor would have, we should be OK. If it ever changes so that + we *must* pass a class, we'll create an UnsafeHTTPSConnection class + which just sets check_domain to False in the class definition, and + choose which one to pass to do_open. + """ + result = HTTPSConnection(*args, **kwargs) + if self.ca_certs: + result.ca_certs = self.ca_certs + result.check_domain = self.check_domain + return result + + def https_open(self, req): + try: + return self.do_open(self._conn_maker, req) + except URLError as e: + if 'certificate verify failed' in str(e.reason): + raise CertificateError('Unable to verify server certificate ' + 'for %s' % req.host) + else: + raise + + # + # To prevent against mixing HTTP traffic with HTTPS (examples: A Man-In-The- + # Middle proxy using HTTP listens on port 443, or an index mistakenly serves + # HTML containing a http://xyz link when it should be https://xyz), + # you can use the following handler class, which does not allow HTTP traffic. + # + # It works by inheriting from HTTPHandler - so build_opener won't add a + # handler for HTTP itself. + # + class HTTPSOnlyHandler(HTTPSHandler, HTTPHandler): + def http_open(self, req): + raise URLError('Unexpected HTTP request on what should be a secure ' + 'connection: %s' % req) + +# +# XML-RPC with timeouts +# + +_ver_info = sys.version_info[:2] + +if _ver_info == (2, 6): + class HTTP(httplib.HTTP): + def __init__(self, host='', port=None, **kwargs): + if port == 0: # 0 means use port 0, not the default port + port = None + self._setup(self._connection_class(host, port, **kwargs)) + + + if ssl: + class HTTPS(httplib.HTTPS): + def __init__(self, host='', port=None, **kwargs): + if port == 0: # 0 means use port 0, not the default port + port = None + self._setup(self._connection_class(host, port, **kwargs)) + + +class Transport(xmlrpclib.Transport): + def __init__(self, timeout, use_datetime=0): + self.timeout = timeout + xmlrpclib.Transport.__init__(self, use_datetime) + + def make_connection(self, host): + h, eh, x509 = self.get_host_info(host) + if _ver_info == (2, 6): + result = HTTP(h, timeout=self.timeout) + else: + if not self._connection or host != self._connection[0]: + self._extra_headers = eh + self._connection = host, httplib.HTTPConnection(h) + result = self._connection[1] + return result + +if ssl: + class SafeTransport(xmlrpclib.SafeTransport): + def __init__(self, timeout, use_datetime=0): + self.timeout = timeout + xmlrpclib.SafeTransport.__init__(self, use_datetime) + + def make_connection(self, host): + h, eh, kwargs = self.get_host_info(host) + if not kwargs: + kwargs = {} + kwargs['timeout'] = self.timeout + if _ver_info == (2, 6): + result = HTTPS(host, None, **kwargs) + else: + if not self._connection or host != self._connection[0]: + self._extra_headers = eh + self._connection = host, httplib.HTTPSConnection(h, None, + **kwargs) + result = self._connection[1] + return result + + +class ServerProxy(xmlrpclib.ServerProxy): + def __init__(self, uri, **kwargs): + self.timeout = timeout = kwargs.pop('timeout', None) + # The above classes only come into play if a timeout + # is specified + if timeout is not None: + scheme, _ = splittype(uri) + use_datetime = kwargs.get('use_datetime', 0) + if scheme == 'https': + tcls = SafeTransport + else: + tcls = Transport + kwargs['transport'] = t = tcls(timeout, use_datetime=use_datetime) + self.transport = t + xmlrpclib.ServerProxy.__init__(self, uri, **kwargs) + +# +# CSV functionality. This is provided because on 2.x, the csv module can't +# handle Unicode. However, we need to deal with Unicode in e.g. RECORD files. +# + +def _csv_open(fn, mode, **kwargs): + if sys.version_info[0] < 3: + mode += 'b' + else: + kwargs['newline'] = '' + # Python 3 determines encoding from locale. Force 'utf-8' + # file encoding to match other forced utf-8 encoding + kwargs['encoding'] = 'utf-8' + return open(fn, mode, **kwargs) + + +class CSVBase(object): + defaults = { + 'delimiter': str(','), # The strs are used because we need native + 'quotechar': str('"'), # str in the csv API (2.x won't take + 'lineterminator': str('\n') # Unicode) + } + + def __enter__(self): + return self + + def __exit__(self, *exc_info): + self.stream.close() + + +class CSVReader(CSVBase): + def __init__(self, **kwargs): + if 'stream' in kwargs: + stream = kwargs['stream'] + if sys.version_info[0] >= 3: + # needs to be a text stream + stream = codecs.getreader('utf-8')(stream) + self.stream = stream + else: + self.stream = _csv_open(kwargs['path'], 'r') + self.reader = csv.reader(self.stream, **self.defaults) + + def __iter__(self): + return self + + def next(self): + result = next(self.reader) + if sys.version_info[0] < 3: + for i, item in enumerate(result): + if not isinstance(item, text_type): + result[i] = item.decode('utf-8') + return result + + __next__ = next + +class CSVWriter(CSVBase): + def __init__(self, fn, **kwargs): + self.stream = _csv_open(fn, 'w') + self.writer = csv.writer(self.stream, **self.defaults) + + def writerow(self, row): + if sys.version_info[0] < 3: + r = [] + for item in row: + if isinstance(item, text_type): + item = item.encode('utf-8') + r.append(item) + row = r + self.writer.writerow(row) + +# +# Configurator functionality +# + +class Configurator(BaseConfigurator): + + value_converters = dict(BaseConfigurator.value_converters) + value_converters['inc'] = 'inc_convert' + + def __init__(self, config, base=None): + super(Configurator, self).__init__(config) + self.base = base or os.getcwd() + + def configure_custom(self, config): + def convert(o): + if isinstance(o, (list, tuple)): + result = type(o)([convert(i) for i in o]) + elif isinstance(o, dict): + if '()' in o: + result = self.configure_custom(o) + else: + result = {} + for k in o: + result[k] = convert(o[k]) + else: + result = self.convert(o) + return result + + c = config.pop('()') + if not callable(c): + c = self.resolve(c) + props = config.pop('.', None) + # Check for valid identifiers + args = config.pop('[]', ()) + if args: + args = tuple([convert(o) for o in args]) + items = [(k, convert(config[k])) for k in config if valid_ident(k)] + kwargs = dict(items) + result = c(*args, **kwargs) + if props: + for n, v in props.items(): + setattr(result, n, convert(v)) + return result + + def __getitem__(self, key): + result = self.config[key] + if isinstance(result, dict) and '()' in result: + self.config[key] = result = self.configure_custom(result) + return result + + def inc_convert(self, value): + """Default converter for the inc:// protocol.""" + if not os.path.isabs(value): + value = os.path.join(self.base, value) + with codecs.open(value, 'r', encoding='utf-8') as f: + result = json.load(f) + return result + + +class SubprocessMixin(object): + """ + Mixin for running subprocesses and capturing their output + """ + def __init__(self, verbose=False, progress=None): + self.verbose = verbose + self.progress = progress + + def reader(self, stream, context): + """ + Read lines from a subprocess' output stream and either pass to a progress + callable (if specified) or write progress information to sys.stderr. + """ + progress = self.progress + verbose = self.verbose + while True: + s = stream.readline() + if not s: + break + if progress is not None: + progress(s, context) + else: + if not verbose: + sys.stderr.write('.') + else: + sys.stderr.write(s.decode('utf-8')) + sys.stderr.flush() + stream.close() + + def run_command(self, cmd, **kwargs): + p = subprocess.Popen(cmd, stdout=subprocess.PIPE, + stderr=subprocess.PIPE, **kwargs) + t1 = threading.Thread(target=self.reader, args=(p.stdout, 'stdout')) + t1.start() + t2 = threading.Thread(target=self.reader, args=(p.stderr, 'stderr')) + t2.start() + p.wait() + t1.join() + t2.join() + if self.progress is not None: + self.progress('done.', 'main') + elif self.verbose: + sys.stderr.write('done.\n') + return p + + +def normalize_name(name): + """Normalize a python package name a la PEP 503""" + # https://www.python.org/dev/peps/pep-0503/#normalized-names + return re.sub('[-_.]+', '-', name).lower() diff --git a/cres/venv/lib/python3.8/site-packages/distlib/version.py b/cres/venv/lib/python3.8/site-packages/distlib/version.py new file mode 100644 index 000000000..3eebe18ee --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/distlib/version.py @@ -0,0 +1,736 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2017 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +""" +Implementation of a flexible versioning scheme providing support for PEP-440, +setuptools-compatible and semantic versioning. +""" + +import logging +import re + +from .compat import string_types +from .util import parse_requirement + +__all__ = ['NormalizedVersion', 'NormalizedMatcher', + 'LegacyVersion', 'LegacyMatcher', + 'SemanticVersion', 'SemanticMatcher', + 'UnsupportedVersionError', 'get_scheme'] + +logger = logging.getLogger(__name__) + + +class UnsupportedVersionError(ValueError): + """This is an unsupported version.""" + pass + + +class Version(object): + def __init__(self, s): + self._string = s = s.strip() + self._parts = parts = self.parse(s) + assert isinstance(parts, tuple) + assert len(parts) > 0 + + def parse(self, s): + raise NotImplementedError('please implement in a subclass') + + def _check_compatible(self, other): + if type(self) != type(other): + raise TypeError('cannot compare %r and %r' % (self, other)) + + def __eq__(self, other): + self._check_compatible(other) + return self._parts == other._parts + + def __ne__(self, other): + return not self.__eq__(other) + + def __lt__(self, other): + self._check_compatible(other) + return self._parts < other._parts + + def __gt__(self, other): + return not (self.__lt__(other) or self.__eq__(other)) + + def __le__(self, other): + return self.__lt__(other) or self.__eq__(other) + + def __ge__(self, other): + return self.__gt__(other) or self.__eq__(other) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + def __hash__(self): + return hash(self._parts) + + def __repr__(self): + return "%s('%s')" % (self.__class__.__name__, self._string) + + def __str__(self): + return self._string + + @property + def is_prerelease(self): + raise NotImplementedError('Please implement in subclasses.') + + +class Matcher(object): + version_class = None + + # value is either a callable or the name of a method + _operators = { + '<': lambda v, c, p: v < c, + '>': lambda v, c, p: v > c, + '<=': lambda v, c, p: v == c or v < c, + '>=': lambda v, c, p: v == c or v > c, + '==': lambda v, c, p: v == c, + '===': lambda v, c, p: v == c, + # by default, compatible => >=. + '~=': lambda v, c, p: v == c or v > c, + '!=': lambda v, c, p: v != c, + } + + # this is a method only to support alternative implementations + # via overriding + def parse_requirement(self, s): + return parse_requirement(s) + + def __init__(self, s): + if self.version_class is None: + raise ValueError('Please specify a version class') + self._string = s = s.strip() + r = self.parse_requirement(s) + if not r: + raise ValueError('Not valid: %r' % s) + self.name = r.name + self.key = self.name.lower() # for case-insensitive comparisons + clist = [] + if r.constraints: + # import pdb; pdb.set_trace() + for op, s in r.constraints: + if s.endswith('.*'): + if op not in ('==', '!='): + raise ValueError('\'.*\' not allowed for ' + '%r constraints' % op) + # Could be a partial version (e.g. for '2.*') which + # won't parse as a version, so keep it as a string + vn, prefix = s[:-2], True + # Just to check that vn is a valid version + self.version_class(vn) + else: + # Should parse as a version, so we can create an + # instance for the comparison + vn, prefix = self.version_class(s), False + clist.append((op, vn, prefix)) + self._parts = tuple(clist) + + def match(self, version): + """ + Check if the provided version matches the constraints. + + :param version: The version to match against this instance. + :type version: String or :class:`Version` instance. + """ + if isinstance(version, string_types): + version = self.version_class(version) + for operator, constraint, prefix in self._parts: + f = self._operators.get(operator) + if isinstance(f, string_types): + f = getattr(self, f) + if not f: + msg = ('%r not implemented ' + 'for %s' % (operator, self.__class__.__name__)) + raise NotImplementedError(msg) + if not f(version, constraint, prefix): + return False + return True + + @property + def exact_version(self): + result = None + if len(self._parts) == 1 and self._parts[0][0] in ('==', '==='): + result = self._parts[0][1] + return result + + def _check_compatible(self, other): + if type(self) != type(other) or self.name != other.name: + raise TypeError('cannot compare %s and %s' % (self, other)) + + def __eq__(self, other): + self._check_compatible(other) + return self.key == other.key and self._parts == other._parts + + def __ne__(self, other): + return not self.__eq__(other) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + def __hash__(self): + return hash(self.key) + hash(self._parts) + + def __repr__(self): + return "%s(%r)" % (self.__class__.__name__, self._string) + + def __str__(self): + return self._string + + +PEP440_VERSION_RE = re.compile(r'^v?(\d+!)?(\d+(\.\d+)*)((a|b|c|rc)(\d+))?' + r'(\.(post)(\d+))?(\.(dev)(\d+))?' + r'(\+([a-zA-Z\d]+(\.[a-zA-Z\d]+)?))?$') + + +def _pep_440_key(s): + s = s.strip() + m = PEP440_VERSION_RE.match(s) + if not m: + raise UnsupportedVersionError('Not a valid version: %s' % s) + groups = m.groups() + nums = tuple(int(v) for v in groups[1].split('.')) + while len(nums) > 1 and nums[-1] == 0: + nums = nums[:-1] + + if not groups[0]: + epoch = 0 + else: + epoch = int(groups[0]) + pre = groups[4:6] + post = groups[7:9] + dev = groups[10:12] + local = groups[13] + if pre == (None, None): + pre = () + else: + pre = pre[0], int(pre[1]) + if post == (None, None): + post = () + else: + post = post[0], int(post[1]) + if dev == (None, None): + dev = () + else: + dev = dev[0], int(dev[1]) + if local is None: + local = () + else: + parts = [] + for part in local.split('.'): + # to ensure that numeric compares as > lexicographic, avoid + # comparing them directly, but encode a tuple which ensures + # correct sorting + if part.isdigit(): + part = (1, int(part)) + else: + part = (0, part) + parts.append(part) + local = tuple(parts) + if not pre: + # either before pre-release, or final release and after + if not post and dev: + # before pre-release + pre = ('a', -1) # to sort before a0 + else: + pre = ('z',) # to sort after all pre-releases + # now look at the state of post and dev. + if not post: + post = ('_',) # sort before 'a' + if not dev: + dev = ('final',) + + #print('%s -> %s' % (s, m.groups())) + return epoch, nums, pre, post, dev, local + + +_normalized_key = _pep_440_key + + +class NormalizedVersion(Version): + """A rational version. + + Good: + 1.2 # equivalent to "1.2.0" + 1.2.0 + 1.2a1 + 1.2.3a2 + 1.2.3b1 + 1.2.3c1 + 1.2.3.4 + TODO: fill this out + + Bad: + 1 # minimum two numbers + 1.2a # release level must have a release serial + 1.2.3b + """ + def parse(self, s): + result = _normalized_key(s) + # _normalized_key loses trailing zeroes in the release + # clause, since that's needed to ensure that X.Y == X.Y.0 == X.Y.0.0 + # However, PEP 440 prefix matching needs it: for example, + # (~= 1.4.5.0) matches differently to (~= 1.4.5.0.0). + m = PEP440_VERSION_RE.match(s) # must succeed + groups = m.groups() + self._release_clause = tuple(int(v) for v in groups[1].split('.')) + return result + + PREREL_TAGS = set(['a', 'b', 'c', 'rc', 'dev']) + + @property + def is_prerelease(self): + return any(t[0] in self.PREREL_TAGS for t in self._parts if t) + + +def _match_prefix(x, y): + x = str(x) + y = str(y) + if x == y: + return True + if not x.startswith(y): + return False + n = len(y) + return x[n] == '.' + + +class NormalizedMatcher(Matcher): + version_class = NormalizedVersion + + # value is either a callable or the name of a method + _operators = { + '~=': '_match_compatible', + '<': '_match_lt', + '>': '_match_gt', + '<=': '_match_le', + '>=': '_match_ge', + '==': '_match_eq', + '===': '_match_arbitrary', + '!=': '_match_ne', + } + + def _adjust_local(self, version, constraint, prefix): + if prefix: + strip_local = '+' not in constraint and version._parts[-1] + else: + # both constraint and version are + # NormalizedVersion instances. + # If constraint does not have a local component, + # ensure the version doesn't, either. + strip_local = not constraint._parts[-1] and version._parts[-1] + if strip_local: + s = version._string.split('+', 1)[0] + version = self.version_class(s) + return version, constraint + + def _match_lt(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if version >= constraint: + return False + release_clause = constraint._release_clause + pfx = '.'.join([str(i) for i in release_clause]) + return not _match_prefix(version, pfx) + + def _match_gt(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if version <= constraint: + return False + release_clause = constraint._release_clause + pfx = '.'.join([str(i) for i in release_clause]) + return not _match_prefix(version, pfx) + + def _match_le(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + return version <= constraint + + def _match_ge(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + return version >= constraint + + def _match_eq(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if not prefix: + result = (version == constraint) + else: + result = _match_prefix(version, constraint) + return result + + def _match_arbitrary(self, version, constraint, prefix): + return str(version) == str(constraint) + + def _match_ne(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if not prefix: + result = (version != constraint) + else: + result = not _match_prefix(version, constraint) + return result + + def _match_compatible(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if version == constraint: + return True + if version < constraint: + return False +# if not prefix: +# return True + release_clause = constraint._release_clause + if len(release_clause) > 1: + release_clause = release_clause[:-1] + pfx = '.'.join([str(i) for i in release_clause]) + return _match_prefix(version, pfx) + +_REPLACEMENTS = ( + (re.compile('[.+-]$'), ''), # remove trailing puncts + (re.compile(r'^[.](\d)'), r'0.\1'), # .N -> 0.N at start + (re.compile('^[.-]'), ''), # remove leading puncts + (re.compile(r'^\((.*)\)$'), r'\1'), # remove parentheses + (re.compile(r'^v(ersion)?\s*(\d+)'), r'\2'), # remove leading v(ersion) + (re.compile(r'^r(ev)?\s*(\d+)'), r'\2'), # remove leading v(ersion) + (re.compile('[.]{2,}'), '.'), # multiple runs of '.' + (re.compile(r'\b(alfa|apha)\b'), 'alpha'), # misspelt alpha + (re.compile(r'\b(pre-alpha|prealpha)\b'), + 'pre.alpha'), # standardise + (re.compile(r'\(beta\)$'), 'beta'), # remove parentheses +) + +_SUFFIX_REPLACEMENTS = ( + (re.compile('^[:~._+-]+'), ''), # remove leading puncts + (re.compile('[,*")([\\]]'), ''), # remove unwanted chars + (re.compile('[~:+_ -]'), '.'), # replace illegal chars + (re.compile('[.]{2,}'), '.'), # multiple runs of '.' + (re.compile(r'\.$'), ''), # trailing '.' +) + +_NUMERIC_PREFIX = re.compile(r'(\d+(\.\d+)*)') + + +def _suggest_semantic_version(s): + """ + Try to suggest a semantic form for a version for which + _suggest_normalized_version couldn't come up with anything. + """ + result = s.strip().lower() + for pat, repl in _REPLACEMENTS: + result = pat.sub(repl, result) + if not result: + result = '0.0.0' + + # Now look for numeric prefix, and separate it out from + # the rest. + #import pdb; pdb.set_trace() + m = _NUMERIC_PREFIX.match(result) + if not m: + prefix = '0.0.0' + suffix = result + else: + prefix = m.groups()[0].split('.') + prefix = [int(i) for i in prefix] + while len(prefix) < 3: + prefix.append(0) + if len(prefix) == 3: + suffix = result[m.end():] + else: + suffix = '.'.join([str(i) for i in prefix[3:]]) + result[m.end():] + prefix = prefix[:3] + prefix = '.'.join([str(i) for i in prefix]) + suffix = suffix.strip() + if suffix: + #import pdb; pdb.set_trace() + # massage the suffix. + for pat, repl in _SUFFIX_REPLACEMENTS: + suffix = pat.sub(repl, suffix) + + if not suffix: + result = prefix + else: + sep = '-' if 'dev' in suffix else '+' + result = prefix + sep + suffix + if not is_semver(result): + result = None + return result + + +def _suggest_normalized_version(s): + """Suggest a normalized version close to the given version string. + + If you have a version string that isn't rational (i.e. NormalizedVersion + doesn't like it) then you might be able to get an equivalent (or close) + rational version from this function. + + This does a number of simple normalizations to the given string, based + on observation of versions currently in use on PyPI. Given a dump of + those version during PyCon 2009, 4287 of them: + - 2312 (53.93%) match NormalizedVersion without change + with the automatic suggestion + - 3474 (81.04%) match when using this suggestion method + + @param s {str} An irrational version string. + @returns A rational version string, or None, if couldn't determine one. + """ + try: + _normalized_key(s) + return s # already rational + except UnsupportedVersionError: + pass + + rs = s.lower() + + # part of this could use maketrans + for orig, repl in (('-alpha', 'a'), ('-beta', 'b'), ('alpha', 'a'), + ('beta', 'b'), ('rc', 'c'), ('-final', ''), + ('-pre', 'c'), + ('-release', ''), ('.release', ''), ('-stable', ''), + ('+', '.'), ('_', '.'), (' ', ''), ('.final', ''), + ('final', '')): + rs = rs.replace(orig, repl) + + # if something ends with dev or pre, we add a 0 + rs = re.sub(r"pre$", r"pre0", rs) + rs = re.sub(r"dev$", r"dev0", rs) + + # if we have something like "b-2" or "a.2" at the end of the + # version, that is probably beta, alpha, etc + # let's remove the dash or dot + rs = re.sub(r"([abc]|rc)[\-\.](\d+)$", r"\1\2", rs) + + # 1.0-dev-r371 -> 1.0.dev371 + # 0.1-dev-r79 -> 0.1.dev79 + rs = re.sub(r"[\-\.](dev)[\-\.]?r?(\d+)$", r".\1\2", rs) + + # Clean: 2.0.a.3, 2.0.b1, 0.9.0~c1 + rs = re.sub(r"[.~]?([abc])\.?", r"\1", rs) + + # Clean: v0.3, v1.0 + if rs.startswith('v'): + rs = rs[1:] + + # Clean leading '0's on numbers. + #TODO: unintended side-effect on, e.g., "2003.05.09" + # PyPI stats: 77 (~2%) better + rs = re.sub(r"\b0+(\d+)(?!\d)", r"\1", rs) + + # Clean a/b/c with no version. E.g. "1.0a" -> "1.0a0". Setuptools infers + # zero. + # PyPI stats: 245 (7.56%) better + rs = re.sub(r"(\d+[abc])$", r"\g<1>0", rs) + + # the 'dev-rNNN' tag is a dev tag + rs = re.sub(r"\.?(dev-r|dev\.r)\.?(\d+)$", r".dev\2", rs) + + # clean the - when used as a pre delimiter + rs = re.sub(r"-(a|b|c)(\d+)$", r"\1\2", rs) + + # a terminal "dev" or "devel" can be changed into ".dev0" + rs = re.sub(r"[\.\-](dev|devel)$", r".dev0", rs) + + # a terminal "dev" can be changed into ".dev0" + rs = re.sub(r"(?![\.\-])dev$", r".dev0", rs) + + # a terminal "final" or "stable" can be removed + rs = re.sub(r"(final|stable)$", "", rs) + + # The 'r' and the '-' tags are post release tags + # 0.4a1.r10 -> 0.4a1.post10 + # 0.9.33-17222 -> 0.9.33.post17222 + # 0.9.33-r17222 -> 0.9.33.post17222 + rs = re.sub(r"\.?(r|-|-r)\.?(\d+)$", r".post\2", rs) + + # Clean 'r' instead of 'dev' usage: + # 0.9.33+r17222 -> 0.9.33.dev17222 + # 1.0dev123 -> 1.0.dev123 + # 1.0.git123 -> 1.0.dev123 + # 1.0.bzr123 -> 1.0.dev123 + # 0.1a0dev.123 -> 0.1a0.dev123 + # PyPI stats: ~150 (~4%) better + rs = re.sub(r"\.?(dev|git|bzr)\.?(\d+)$", r".dev\2", rs) + + # Clean '.pre' (normalized from '-pre' above) instead of 'c' usage: + # 0.2.pre1 -> 0.2c1 + # 0.2-c1 -> 0.2c1 + # 1.0preview123 -> 1.0c123 + # PyPI stats: ~21 (0.62%) better + rs = re.sub(r"\.?(pre|preview|-c)(\d+)$", r"c\g<2>", rs) + + # Tcl/Tk uses "px" for their post release markers + rs = re.sub(r"p(\d+)$", r".post\1", rs) + + try: + _normalized_key(rs) + except UnsupportedVersionError: + rs = None + return rs + +# +# Legacy version processing (distribute-compatible) +# + +_VERSION_PART = re.compile(r'([a-z]+|\d+|[\.-])', re.I) +_VERSION_REPLACE = { + 'pre': 'c', + 'preview': 'c', + '-': 'final-', + 'rc': 'c', + 'dev': '@', + '': None, + '.': None, +} + + +def _legacy_key(s): + def get_parts(s): + result = [] + for p in _VERSION_PART.split(s.lower()): + p = _VERSION_REPLACE.get(p, p) + if p: + if '0' <= p[:1] <= '9': + p = p.zfill(8) + else: + p = '*' + p + result.append(p) + result.append('*final') + return result + + result = [] + for p in get_parts(s): + if p.startswith('*'): + if p < '*final': + while result and result[-1] == '*final-': + result.pop() + while result and result[-1] == '00000000': + result.pop() + result.append(p) + return tuple(result) + + +class LegacyVersion(Version): + def parse(self, s): + return _legacy_key(s) + + @property + def is_prerelease(self): + result = False + for x in self._parts: + if (isinstance(x, string_types) and x.startswith('*') and + x < '*final'): + result = True + break + return result + + +class LegacyMatcher(Matcher): + version_class = LegacyVersion + + _operators = dict(Matcher._operators) + _operators['~='] = '_match_compatible' + + numeric_re = re.compile(r'^(\d+(\.\d+)*)') + + def _match_compatible(self, version, constraint, prefix): + if version < constraint: + return False + m = self.numeric_re.match(str(constraint)) + if not m: + logger.warning('Cannot compute compatible match for version %s ' + ' and constraint %s', version, constraint) + return True + s = m.groups()[0] + if '.' in s: + s = s.rsplit('.', 1)[0] + return _match_prefix(version, s) + +# +# Semantic versioning +# + +_SEMVER_RE = re.compile(r'^(\d+)\.(\d+)\.(\d+)' + r'(-[a-z0-9]+(\.[a-z0-9-]+)*)?' + r'(\+[a-z0-9]+(\.[a-z0-9-]+)*)?$', re.I) + + +def is_semver(s): + return _SEMVER_RE.match(s) + + +def _semantic_key(s): + def make_tuple(s, absent): + if s is None: + result = (absent,) + else: + parts = s[1:].split('.') + # We can't compare ints and strings on Python 3, so fudge it + # by zero-filling numeric values so simulate a numeric comparison + result = tuple([p.zfill(8) if p.isdigit() else p for p in parts]) + return result + + m = is_semver(s) + if not m: + raise UnsupportedVersionError(s) + groups = m.groups() + major, minor, patch = [int(i) for i in groups[:3]] + # choose the '|' and '*' so that versions sort correctly + pre, build = make_tuple(groups[3], '|'), make_tuple(groups[5], '*') + return (major, minor, patch), pre, build + + +class SemanticVersion(Version): + def parse(self, s): + return _semantic_key(s) + + @property + def is_prerelease(self): + return self._parts[1][0] != '|' + + +class SemanticMatcher(Matcher): + version_class = SemanticVersion + + +class VersionScheme(object): + def __init__(self, key, matcher, suggester=None): + self.key = key + self.matcher = matcher + self.suggester = suggester + + def is_valid_version(self, s): + try: + self.matcher.version_class(s) + result = True + except UnsupportedVersionError: + result = False + return result + + def is_valid_matcher(self, s): + try: + self.matcher(s) + result = True + except UnsupportedVersionError: + result = False + return result + + def is_valid_constraint_list(self, s): + """ + Used for processing some metadata fields + """ + return self.is_valid_matcher('dummy_name (%s)' % s) + + def suggest(self, s): + if self.suggester is None: + result = None + else: + result = self.suggester(s) + return result + +_SCHEMES = { + 'normalized': VersionScheme(_normalized_key, NormalizedMatcher, + _suggest_normalized_version), + 'legacy': VersionScheme(_legacy_key, LegacyMatcher, lambda self, s: s), + 'semantic': VersionScheme(_semantic_key, SemanticMatcher, + _suggest_semantic_version), +} + +_SCHEMES['default'] = _SCHEMES['normalized'] + + +def get_scheme(name): + if name not in _SCHEMES: + raise ValueError('unknown scheme name: %r' % name) + return _SCHEMES[name] diff --git a/cres/venv/lib/python3.8/site-packages/distlib/wheel.py b/cres/venv/lib/python3.8/site-packages/distlib/wheel.py new file mode 100644 index 000000000..bd179383a --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/distlib/wheel.py @@ -0,0 +1,1004 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2017 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from __future__ import unicode_literals + +import base64 +import codecs +import datetime +import distutils.util +from email import message_from_file +import hashlib +import imp +import json +import logging +import os +import posixpath +import re +import shutil +import sys +import tempfile +import zipfile + +from . import __version__, DistlibException +from .compat import sysconfig, ZipFile, fsdecode, text_type, filter +from .database import InstalledDistribution +from .metadata import Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME +from .util import (FileOperator, convert_path, CSVReader, CSVWriter, Cache, + cached_property, get_cache_base, read_exports, tempdir) +from .version import NormalizedVersion, UnsupportedVersionError + +logger = logging.getLogger(__name__) + +cache = None # created when needed + +if hasattr(sys, 'pypy_version_info'): # pragma: no cover + IMP_PREFIX = 'pp' +elif sys.platform.startswith('java'): # pragma: no cover + IMP_PREFIX = 'jy' +elif sys.platform == 'cli': # pragma: no cover + IMP_PREFIX = 'ip' +else: + IMP_PREFIX = 'cp' + +VER_SUFFIX = sysconfig.get_config_var('py_version_nodot') +if not VER_SUFFIX: # pragma: no cover + VER_SUFFIX = '%s%s' % sys.version_info[:2] +PYVER = 'py' + VER_SUFFIX +IMPVER = IMP_PREFIX + VER_SUFFIX + +ARCH = distutils.util.get_platform().replace('-', '_').replace('.', '_') + +ABI = sysconfig.get_config_var('SOABI') +if ABI and ABI.startswith('cpython-'): + ABI = ABI.replace('cpython-', 'cp') +else: + def _derive_abi(): + parts = ['cp', VER_SUFFIX] + if sysconfig.get_config_var('Py_DEBUG'): + parts.append('d') + if sysconfig.get_config_var('WITH_PYMALLOC'): + parts.append('m') + if sysconfig.get_config_var('Py_UNICODE_SIZE') == 4: + parts.append('u') + return ''.join(parts) + ABI = _derive_abi() + del _derive_abi + +FILENAME_RE = re.compile(r''' +(?P[^-]+) +-(?P\d+[^-]*) +(-(?P\d+[^-]*))? +-(?P\w+\d+(\.\w+\d+)*) +-(?P\w+) +-(?P\w+(\.\w+)*) +\.whl$ +''', re.IGNORECASE | re.VERBOSE) + +NAME_VERSION_RE = re.compile(r''' +(?P[^-]+) +-(?P\d+[^-]*) +(-(?P\d+[^-]*))?$ +''', re.IGNORECASE | re.VERBOSE) + +SHEBANG_RE = re.compile(br'\s*#![^\r\n]*') +SHEBANG_DETAIL_RE = re.compile(br'^(\s*#!("[^"]+"|\S+))\s+(.*)$') +SHEBANG_PYTHON = b'#!python' +SHEBANG_PYTHONW = b'#!pythonw' + +if os.sep == '/': + to_posix = lambda o: o +else: + to_posix = lambda o: o.replace(os.sep, '/') + + +class Mounter(object): + def __init__(self): + self.impure_wheels = {} + self.libs = {} + + def add(self, pathname, extensions): + self.impure_wheels[pathname] = extensions + self.libs.update(extensions) + + def remove(self, pathname): + extensions = self.impure_wheels.pop(pathname) + for k, v in extensions: + if k in self.libs: + del self.libs[k] + + def find_module(self, fullname, path=None): + if fullname in self.libs: + result = self + else: + result = None + return result + + def load_module(self, fullname): + if fullname in sys.modules: + result = sys.modules[fullname] + else: + if fullname not in self.libs: + raise ImportError('unable to find extension for %s' % fullname) + result = imp.load_dynamic(fullname, self.libs[fullname]) + result.__loader__ = self + parts = fullname.rsplit('.', 1) + if len(parts) > 1: + result.__package__ = parts[0] + return result + +_hook = Mounter() + + +class Wheel(object): + """ + Class to build and install from Wheel files (PEP 427). + """ + + wheel_version = (1, 1) + hash_kind = 'sha256' + + def __init__(self, filename=None, sign=False, verify=False): + """ + Initialise an instance using a (valid) filename. + """ + self.sign = sign + self.should_verify = verify + self.buildver = '' + self.pyver = [PYVER] + self.abi = ['none'] + self.arch = ['any'] + self.dirname = os.getcwd() + if filename is None: + self.name = 'dummy' + self.version = '0.1' + self._filename = self.filename + else: + m = NAME_VERSION_RE.match(filename) + if m: + info = m.groupdict('') + self.name = info['nm'] + # Reinstate the local version separator + self.version = info['vn'].replace('_', '-') + self.buildver = info['bn'] + self._filename = self.filename + else: + dirname, filename = os.path.split(filename) + m = FILENAME_RE.match(filename) + if not m: + raise DistlibException('Invalid name or ' + 'filename: %r' % filename) + if dirname: + self.dirname = os.path.abspath(dirname) + self._filename = filename + info = m.groupdict('') + self.name = info['nm'] + self.version = info['vn'] + self.buildver = info['bn'] + self.pyver = info['py'].split('.') + self.abi = info['bi'].split('.') + self.arch = info['ar'].split('.') + + @property + def filename(self): + """ + Build and return a filename from the various components. + """ + if self.buildver: + buildver = '-' + self.buildver + else: + buildver = '' + pyver = '.'.join(self.pyver) + abi = '.'.join(self.abi) + arch = '.'.join(self.arch) + # replace - with _ as a local version separator + version = self.version.replace('-', '_') + return '%s-%s%s-%s-%s-%s.whl' % (self.name, version, buildver, + pyver, abi, arch) + + @property + def exists(self): + path = os.path.join(self.dirname, self.filename) + return os.path.isfile(path) + + @property + def tags(self): + for pyver in self.pyver: + for abi in self.abi: + for arch in self.arch: + yield pyver, abi, arch + + @cached_property + def metadata(self): + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + wrapper = codecs.getreader('utf-8') + with ZipFile(pathname, 'r') as zf: + wheel_metadata = self.get_wheel_metadata(zf) + wv = wheel_metadata['Wheel-Version'].split('.', 1) + file_version = tuple([int(i) for i in wv]) + if file_version < (1, 1): + fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME, 'METADATA'] + else: + fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME] + result = None + for fn in fns: + try: + metadata_filename = posixpath.join(info_dir, fn) + with zf.open(metadata_filename) as bf: + wf = wrapper(bf) + result = Metadata(fileobj=wf) + if result: + break + except KeyError: + pass + if not result: + raise ValueError('Invalid wheel, because metadata is ' + 'missing: looked in %s' % ', '.join(fns)) + return result + + def get_wheel_metadata(self, zf): + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + metadata_filename = posixpath.join(info_dir, 'WHEEL') + with zf.open(metadata_filename) as bf: + wf = codecs.getreader('utf-8')(bf) + message = message_from_file(wf) + return dict(message) + + @cached_property + def info(self): + pathname = os.path.join(self.dirname, self.filename) + with ZipFile(pathname, 'r') as zf: + result = self.get_wheel_metadata(zf) + return result + + def process_shebang(self, data): + m = SHEBANG_RE.match(data) + if m: + end = m.end() + shebang, data_after_shebang = data[:end], data[end:] + # Preserve any arguments after the interpreter + if b'pythonw' in shebang.lower(): + shebang_python = SHEBANG_PYTHONW + else: + shebang_python = SHEBANG_PYTHON + m = SHEBANG_DETAIL_RE.match(shebang) + if m: + args = b' ' + m.groups()[-1] + else: + args = b'' + shebang = shebang_python + args + data = shebang + data_after_shebang + else: + cr = data.find(b'\r') + lf = data.find(b'\n') + if cr < 0 or cr > lf: + term = b'\n' + else: + if data[cr:cr + 2] == b'\r\n': + term = b'\r\n' + else: + term = b'\r' + data = SHEBANG_PYTHON + term + data + return data + + def get_hash(self, data, hash_kind=None): + if hash_kind is None: + hash_kind = self.hash_kind + try: + hasher = getattr(hashlib, hash_kind) + except AttributeError: + raise DistlibException('Unsupported hash algorithm: %r' % hash_kind) + result = hasher(data).digest() + result = base64.urlsafe_b64encode(result).rstrip(b'=').decode('ascii') + return hash_kind, result + + def write_record(self, records, record_path, base): + records = list(records) # make a copy for sorting + p = to_posix(os.path.relpath(record_path, base)) + records.append((p, '', '')) + records.sort() + with CSVWriter(record_path) as writer: + for row in records: + writer.writerow(row) + + def write_records(self, info, libdir, archive_paths): + records = [] + distinfo, info_dir = info + hasher = getattr(hashlib, self.hash_kind) + for ap, p in archive_paths: + with open(p, 'rb') as f: + data = f.read() + digest = '%s=%s' % self.get_hash(data) + size = os.path.getsize(p) + records.append((ap, digest, size)) + + p = os.path.join(distinfo, 'RECORD') + self.write_record(records, p, libdir) + ap = to_posix(os.path.join(info_dir, 'RECORD')) + archive_paths.append((ap, p)) + + def build_zip(self, pathname, archive_paths): + with ZipFile(pathname, 'w', zipfile.ZIP_DEFLATED) as zf: + for ap, p in archive_paths: + logger.debug('Wrote %s to %s in wheel', p, ap) + zf.write(p, ap) + + def build(self, paths, tags=None, wheel_version=None): + """ + Build a wheel from files in specified paths, and use any specified tags + when determining the name of the wheel. + """ + if tags is None: + tags = {} + + libkey = list(filter(lambda o: o in paths, ('purelib', 'platlib')))[0] + if libkey == 'platlib': + is_pure = 'false' + default_pyver = [IMPVER] + default_abi = [ABI] + default_arch = [ARCH] + else: + is_pure = 'true' + default_pyver = [PYVER] + default_abi = ['none'] + default_arch = ['any'] + + self.pyver = tags.get('pyver', default_pyver) + self.abi = tags.get('abi', default_abi) + self.arch = tags.get('arch', default_arch) + + libdir = paths[libkey] + + name_ver = '%s-%s' % (self.name, self.version) + data_dir = '%s.data' % name_ver + info_dir = '%s.dist-info' % name_ver + + archive_paths = [] + + # First, stuff which is not in site-packages + for key in ('data', 'headers', 'scripts'): + if key not in paths: + continue + path = paths[key] + if os.path.isdir(path): + for root, dirs, files in os.walk(path): + for fn in files: + p = fsdecode(os.path.join(root, fn)) + rp = os.path.relpath(p, path) + ap = to_posix(os.path.join(data_dir, key, rp)) + archive_paths.append((ap, p)) + if key == 'scripts' and not p.endswith('.exe'): + with open(p, 'rb') as f: + data = f.read() + data = self.process_shebang(data) + with open(p, 'wb') as f: + f.write(data) + + # Now, stuff which is in site-packages, other than the + # distinfo stuff. + path = libdir + distinfo = None + for root, dirs, files in os.walk(path): + if root == path: + # At the top level only, save distinfo for later + # and skip it for now + for i, dn in enumerate(dirs): + dn = fsdecode(dn) + if dn.endswith('.dist-info'): + distinfo = os.path.join(root, dn) + del dirs[i] + break + assert distinfo, '.dist-info directory expected, not found' + + for fn in files: + # comment out next suite to leave .pyc files in + if fsdecode(fn).endswith(('.pyc', '.pyo')): + continue + p = os.path.join(root, fn) + rp = to_posix(os.path.relpath(p, path)) + archive_paths.append((rp, p)) + + # Now distinfo. Assumed to be flat, i.e. os.listdir is enough. + files = os.listdir(distinfo) + for fn in files: + if fn not in ('RECORD', 'INSTALLER', 'SHARED', 'WHEEL'): + p = fsdecode(os.path.join(distinfo, fn)) + ap = to_posix(os.path.join(info_dir, fn)) + archive_paths.append((ap, p)) + + wheel_metadata = [ + 'Wheel-Version: %d.%d' % (wheel_version or self.wheel_version), + 'Generator: distlib %s' % __version__, + 'Root-Is-Purelib: %s' % is_pure, + ] + for pyver, abi, arch in self.tags: + wheel_metadata.append('Tag: %s-%s-%s' % (pyver, abi, arch)) + p = os.path.join(distinfo, 'WHEEL') + with open(p, 'w') as f: + f.write('\n'.join(wheel_metadata)) + ap = to_posix(os.path.join(info_dir, 'WHEEL')) + archive_paths.append((ap, p)) + + # Now, at last, RECORD. + # Paths in here are archive paths - nothing else makes sense. + self.write_records((distinfo, info_dir), libdir, archive_paths) + # Now, ready to build the zip file + pathname = os.path.join(self.dirname, self.filename) + self.build_zip(pathname, archive_paths) + return pathname + + def skip_entry(self, arcname): + """ + Determine whether an archive entry should be skipped when verifying + or installing. + """ + # The signature file won't be in RECORD, + # and we don't currently don't do anything with it + # We also skip directories, as they won't be in RECORD + # either. See: + # + # https://github.com/pypa/wheel/issues/294 + # https://github.com/pypa/wheel/issues/287 + # https://github.com/pypa/wheel/pull/289 + # + return arcname.endswith(('/', '/RECORD.jws')) + + def install(self, paths, maker, **kwargs): + """ + Install a wheel to the specified paths. If kwarg ``warner`` is + specified, it should be a callable, which will be called with two + tuples indicating the wheel version of this software and the wheel + version in the file, if there is a discrepancy in the versions. + This can be used to issue any warnings to raise any exceptions. + If kwarg ``lib_only`` is True, only the purelib/platlib files are + installed, and the headers, scripts, data and dist-info metadata are + not written. If kwarg ``bytecode_hashed_invalidation`` is True, written + bytecode will try to use file-hash based invalidation (PEP-552) on + supported interpreter versions (CPython 2.7+). + + The return value is a :class:`InstalledDistribution` instance unless + ``options.lib_only`` is True, in which case the return value is ``None``. + """ + + dry_run = maker.dry_run + warner = kwargs.get('warner') + lib_only = kwargs.get('lib_only', False) + bc_hashed_invalidation = kwargs.get('bytecode_hashed_invalidation', False) + + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + data_dir = '%s.data' % name_ver + info_dir = '%s.dist-info' % name_ver + + metadata_name = posixpath.join(info_dir, METADATA_FILENAME) + wheel_metadata_name = posixpath.join(info_dir, 'WHEEL') + record_name = posixpath.join(info_dir, 'RECORD') + + wrapper = codecs.getreader('utf-8') + + with ZipFile(pathname, 'r') as zf: + with zf.open(wheel_metadata_name) as bwf: + wf = wrapper(bwf) + message = message_from_file(wf) + wv = message['Wheel-Version'].split('.', 1) + file_version = tuple([int(i) for i in wv]) + if (file_version != self.wheel_version) and warner: + warner(self.wheel_version, file_version) + + if message['Root-Is-Purelib'] == 'true': + libdir = paths['purelib'] + else: + libdir = paths['platlib'] + + records = {} + with zf.open(record_name) as bf: + with CSVReader(stream=bf) as reader: + for row in reader: + p = row[0] + records[p] = row + + data_pfx = posixpath.join(data_dir, '') + info_pfx = posixpath.join(info_dir, '') + script_pfx = posixpath.join(data_dir, 'scripts', '') + + # make a new instance rather than a copy of maker's, + # as we mutate it + fileop = FileOperator(dry_run=dry_run) + fileop.record = True # so we can rollback if needed + + bc = not sys.dont_write_bytecode # Double negatives. Lovely! + + outfiles = [] # for RECORD writing + + # for script copying/shebang processing + workdir = tempfile.mkdtemp() + # set target dir later + # we default add_launchers to False, as the + # Python Launcher should be used instead + maker.source_dir = workdir + maker.target_dir = None + try: + for zinfo in zf.infolist(): + arcname = zinfo.filename + if isinstance(arcname, text_type): + u_arcname = arcname + else: + u_arcname = arcname.decode('utf-8') + if self.skip_entry(u_arcname): + continue + row = records[u_arcname] + if row[2] and str(zinfo.file_size) != row[2]: + raise DistlibException('size mismatch for ' + '%s' % u_arcname) + if row[1]: + kind, value = row[1].split('=', 1) + with zf.open(arcname) as bf: + data = bf.read() + _, digest = self.get_hash(data, kind) + if digest != value: + raise DistlibException('digest mismatch for ' + '%s' % arcname) + + if lib_only and u_arcname.startswith((info_pfx, data_pfx)): + logger.debug('lib_only: skipping %s', u_arcname) + continue + is_script = (u_arcname.startswith(script_pfx) + and not u_arcname.endswith('.exe')) + + if u_arcname.startswith(data_pfx): + _, where, rp = u_arcname.split('/', 2) + outfile = os.path.join(paths[where], convert_path(rp)) + else: + # meant for site-packages. + if u_arcname in (wheel_metadata_name, record_name): + continue + outfile = os.path.join(libdir, convert_path(u_arcname)) + if not is_script: + with zf.open(arcname) as bf: + fileop.copy_stream(bf, outfile) + outfiles.append(outfile) + # Double check the digest of the written file + if not dry_run and row[1]: + with open(outfile, 'rb') as bf: + data = bf.read() + _, newdigest = self.get_hash(data, kind) + if newdigest != digest: + raise DistlibException('digest mismatch ' + 'on write for ' + '%s' % outfile) + if bc and outfile.endswith('.py'): + try: + pyc = fileop.byte_compile(outfile, + hashed_invalidation=bc_hashed_invalidation) + outfiles.append(pyc) + except Exception: + # Don't give up if byte-compilation fails, + # but log it and perhaps warn the user + logger.warning('Byte-compilation failed', + exc_info=True) + else: + fn = os.path.basename(convert_path(arcname)) + workname = os.path.join(workdir, fn) + with zf.open(arcname) as bf: + fileop.copy_stream(bf, workname) + + dn, fn = os.path.split(outfile) + maker.target_dir = dn + filenames = maker.make(fn) + fileop.set_executable_mode(filenames) + outfiles.extend(filenames) + + if lib_only: + logger.debug('lib_only: returning None') + dist = None + else: + # Generate scripts + + # Try to get pydist.json so we can see if there are + # any commands to generate. If this fails (e.g. because + # of a legacy wheel), log a warning but don't give up. + commands = None + file_version = self.info['Wheel-Version'] + if file_version == '1.0': + # Use legacy info + ep = posixpath.join(info_dir, 'entry_points.txt') + try: + with zf.open(ep) as bwf: + epdata = read_exports(bwf) + commands = {} + for key in ('console', 'gui'): + k = '%s_scripts' % key + if k in epdata: + commands['wrap_%s' % key] = d = {} + for v in epdata[k].values(): + s = '%s:%s' % (v.prefix, v.suffix) + if v.flags: + s += ' %s' % v.flags + d[v.name] = s + except Exception: + logger.warning('Unable to read legacy script ' + 'metadata, so cannot generate ' + 'scripts') + else: + try: + with zf.open(metadata_name) as bwf: + wf = wrapper(bwf) + commands = json.load(wf).get('extensions') + if commands: + commands = commands.get('python.commands') + except Exception: + logger.warning('Unable to read JSON metadata, so ' + 'cannot generate scripts') + if commands: + console_scripts = commands.get('wrap_console', {}) + gui_scripts = commands.get('wrap_gui', {}) + if console_scripts or gui_scripts: + script_dir = paths.get('scripts', '') + if not os.path.isdir(script_dir): + raise ValueError('Valid script path not ' + 'specified') + maker.target_dir = script_dir + for k, v in console_scripts.items(): + script = '%s = %s' % (k, v) + filenames = maker.make(script) + fileop.set_executable_mode(filenames) + + if gui_scripts: + options = {'gui': True } + for k, v in gui_scripts.items(): + script = '%s = %s' % (k, v) + filenames = maker.make(script, options) + fileop.set_executable_mode(filenames) + + p = os.path.join(libdir, info_dir) + dist = InstalledDistribution(p) + + # Write SHARED + paths = dict(paths) # don't change passed in dict + del paths['purelib'] + del paths['platlib'] + paths['lib'] = libdir + p = dist.write_shared_locations(paths, dry_run) + if p: + outfiles.append(p) + + # Write RECORD + dist.write_installed_files(outfiles, paths['prefix'], + dry_run) + return dist + except Exception: # pragma: no cover + logger.exception('installation failed.') + fileop.rollback() + raise + finally: + shutil.rmtree(workdir) + + def _get_dylib_cache(self): + global cache + if cache is None: + # Use native string to avoid issues on 2.x: see Python #20140. + base = os.path.join(get_cache_base(), str('dylib-cache'), + '%s.%s' % sys.version_info[:2]) + cache = Cache(base) + return cache + + def _get_extensions(self): + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + arcname = posixpath.join(info_dir, 'EXTENSIONS') + wrapper = codecs.getreader('utf-8') + result = [] + with ZipFile(pathname, 'r') as zf: + try: + with zf.open(arcname) as bf: + wf = wrapper(bf) + extensions = json.load(wf) + cache = self._get_dylib_cache() + prefix = cache.prefix_to_dir(pathname) + cache_base = os.path.join(cache.base, prefix) + if not os.path.isdir(cache_base): + os.makedirs(cache_base) + for name, relpath in extensions.items(): + dest = os.path.join(cache_base, convert_path(relpath)) + if not os.path.exists(dest): + extract = True + else: + file_time = os.stat(dest).st_mtime + file_time = datetime.datetime.fromtimestamp(file_time) + info = zf.getinfo(relpath) + wheel_time = datetime.datetime(*info.date_time) + extract = wheel_time > file_time + if extract: + zf.extract(relpath, cache_base) + result.append((name, dest)) + except KeyError: + pass + return result + + def is_compatible(self): + """ + Determine if a wheel is compatible with the running system. + """ + return is_compatible(self) + + def is_mountable(self): + """ + Determine if a wheel is asserted as mountable by its metadata. + """ + return True # for now - metadata details TBD + + def mount(self, append=False): + pathname = os.path.abspath(os.path.join(self.dirname, self.filename)) + if not self.is_compatible(): + msg = 'Wheel %s not compatible with this Python.' % pathname + raise DistlibException(msg) + if not self.is_mountable(): + msg = 'Wheel %s is marked as not mountable.' % pathname + raise DistlibException(msg) + if pathname in sys.path: + logger.debug('%s already in path', pathname) + else: + if append: + sys.path.append(pathname) + else: + sys.path.insert(0, pathname) + extensions = self._get_extensions() + if extensions: + if _hook not in sys.meta_path: + sys.meta_path.append(_hook) + _hook.add(pathname, extensions) + + def unmount(self): + pathname = os.path.abspath(os.path.join(self.dirname, self.filename)) + if pathname not in sys.path: + logger.debug('%s not in path', pathname) + else: + sys.path.remove(pathname) + if pathname in _hook.impure_wheels: + _hook.remove(pathname) + if not _hook.impure_wheels: + if _hook in sys.meta_path: + sys.meta_path.remove(_hook) + + def verify(self): + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + data_dir = '%s.data' % name_ver + info_dir = '%s.dist-info' % name_ver + + metadata_name = posixpath.join(info_dir, METADATA_FILENAME) + wheel_metadata_name = posixpath.join(info_dir, 'WHEEL') + record_name = posixpath.join(info_dir, 'RECORD') + + wrapper = codecs.getreader('utf-8') + + with ZipFile(pathname, 'r') as zf: + with zf.open(wheel_metadata_name) as bwf: + wf = wrapper(bwf) + message = message_from_file(wf) + wv = message['Wheel-Version'].split('.', 1) + file_version = tuple([int(i) for i in wv]) + # TODO version verification + + records = {} + with zf.open(record_name) as bf: + with CSVReader(stream=bf) as reader: + for row in reader: + p = row[0] + records[p] = row + + for zinfo in zf.infolist(): + arcname = zinfo.filename + if isinstance(arcname, text_type): + u_arcname = arcname + else: + u_arcname = arcname.decode('utf-8') + # See issue #115: some wheels have .. in their entries, but + # in the filename ... e.g. __main__..py ! So the check is + # updated to look for .. in the directory portions + p = u_arcname.split('/') + if '..' in p: + raise DistlibException('invalid entry in ' + 'wheel: %r' % u_arcname) + + if self.skip_entry(u_arcname): + continue + row = records[u_arcname] + if row[2] and str(zinfo.file_size) != row[2]: + raise DistlibException('size mismatch for ' + '%s' % u_arcname) + if row[1]: + kind, value = row[1].split('=', 1) + with zf.open(arcname) as bf: + data = bf.read() + _, digest = self.get_hash(data, kind) + if digest != value: + raise DistlibException('digest mismatch for ' + '%s' % arcname) + + def update(self, modifier, dest_dir=None, **kwargs): + """ + Update the contents of a wheel in a generic way. The modifier should + be a callable which expects a dictionary argument: its keys are + archive-entry paths, and its values are absolute filesystem paths + where the contents the corresponding archive entries can be found. The + modifier is free to change the contents of the files pointed to, add + new entries and remove entries, before returning. This method will + extract the entire contents of the wheel to a temporary location, call + the modifier, and then use the passed (and possibly updated) + dictionary to write a new wheel. If ``dest_dir`` is specified, the new + wheel is written there -- otherwise, the original wheel is overwritten. + + The modifier should return True if it updated the wheel, else False. + This method returns the same value the modifier returns. + """ + + def get_version(path_map, info_dir): + version = path = None + key = '%s/%s' % (info_dir, METADATA_FILENAME) + if key not in path_map: + key = '%s/PKG-INFO' % info_dir + if key in path_map: + path = path_map[key] + version = Metadata(path=path).version + return version, path + + def update_version(version, path): + updated = None + try: + v = NormalizedVersion(version) + i = version.find('-') + if i < 0: + updated = '%s+1' % version + else: + parts = [int(s) for s in version[i + 1:].split('.')] + parts[-1] += 1 + updated = '%s+%s' % (version[:i], + '.'.join(str(i) for i in parts)) + except UnsupportedVersionError: + logger.debug('Cannot update non-compliant (PEP-440) ' + 'version %r', version) + if updated: + md = Metadata(path=path) + md.version = updated + legacy = not path.endswith(METADATA_FILENAME) + md.write(path=path, legacy=legacy) + logger.debug('Version updated from %r to %r', version, + updated) + + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + record_name = posixpath.join(info_dir, 'RECORD') + with tempdir() as workdir: + with ZipFile(pathname, 'r') as zf: + path_map = {} + for zinfo in zf.infolist(): + arcname = zinfo.filename + if isinstance(arcname, text_type): + u_arcname = arcname + else: + u_arcname = arcname.decode('utf-8') + if u_arcname == record_name: + continue + if '..' in u_arcname: + raise DistlibException('invalid entry in ' + 'wheel: %r' % u_arcname) + zf.extract(zinfo, workdir) + path = os.path.join(workdir, convert_path(u_arcname)) + path_map[u_arcname] = path + + # Remember the version. + original_version, _ = get_version(path_map, info_dir) + # Files extracted. Call the modifier. + modified = modifier(path_map, **kwargs) + if modified: + # Something changed - need to build a new wheel. + current_version, path = get_version(path_map, info_dir) + if current_version and (current_version == original_version): + # Add or update local version to signify changes. + update_version(current_version, path) + # Decide where the new wheel goes. + if dest_dir is None: + fd, newpath = tempfile.mkstemp(suffix='.whl', + prefix='wheel-update-', + dir=workdir) + os.close(fd) + else: + if not os.path.isdir(dest_dir): + raise DistlibException('Not a directory: %r' % dest_dir) + newpath = os.path.join(dest_dir, self.filename) + archive_paths = list(path_map.items()) + distinfo = os.path.join(workdir, info_dir) + info = distinfo, info_dir + self.write_records(info, workdir, archive_paths) + self.build_zip(newpath, archive_paths) + if dest_dir is None: + shutil.copyfile(newpath, pathname) + return modified + +def compatible_tags(): + """ + Return (pyver, abi, arch) tuples compatible with this Python. + """ + versions = [VER_SUFFIX] + major = VER_SUFFIX[0] + for minor in range(sys.version_info[1] - 1, - 1, -1): + versions.append(''.join([major, str(minor)])) + + abis = [] + for suffix, _, _ in imp.get_suffixes(): + if suffix.startswith('.abi'): + abis.append(suffix.split('.', 2)[1]) + abis.sort() + if ABI != 'none': + abis.insert(0, ABI) + abis.append('none') + result = [] + + arches = [ARCH] + if sys.platform == 'darwin': + m = re.match(r'(\w+)_(\d+)_(\d+)_(\w+)$', ARCH) + if m: + name, major, minor, arch = m.groups() + minor = int(minor) + matches = [arch] + if arch in ('i386', 'ppc'): + matches.append('fat') + if arch in ('i386', 'ppc', 'x86_64'): + matches.append('fat3') + if arch in ('ppc64', 'x86_64'): + matches.append('fat64') + if arch in ('i386', 'x86_64'): + matches.append('intel') + if arch in ('i386', 'x86_64', 'intel', 'ppc', 'ppc64'): + matches.append('universal') + while minor >= 0: + for match in matches: + s = '%s_%s_%s_%s' % (name, major, minor, match) + if s != ARCH: # already there + arches.append(s) + minor -= 1 + + # Most specific - our Python version, ABI and arch + for abi in abis: + for arch in arches: + result.append((''.join((IMP_PREFIX, versions[0])), abi, arch)) + + # where no ABI / arch dependency, but IMP_PREFIX dependency + for i, version in enumerate(versions): + result.append((''.join((IMP_PREFIX, version)), 'none', 'any')) + if i == 0: + result.append((''.join((IMP_PREFIX, version[0])), 'none', 'any')) + + # no IMP_PREFIX, ABI or arch dependency + for i, version in enumerate(versions): + result.append((''.join(('py', version)), 'none', 'any')) + if i == 0: + result.append((''.join(('py', version[0])), 'none', 'any')) + return set(result) + + +COMPATIBLE_TAGS = compatible_tags() + +del compatible_tags + + +def is_compatible(wheel, tags=None): + if not isinstance(wheel, Wheel): + wheel = Wheel(wheel) # assume it's a filename + result = False + if tags is None: + tags = COMPATIBLE_TAGS + for ver, abi, arch in tags: + if ver in wheel.pyver and abi in wheel.abi and arch in wheel.arch: + result = True + break + return result diff --git a/cres/venv/lib/python3.8/site-packages/distro-1.4.0.dist-info/AUTHORS.txt b/cres/venv/lib/python3.8/site-packages/distro-1.4.0.dist-info/AUTHORS.txt new file mode 100644 index 000000000..72c87d7d3 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/distro-1.4.0.dist-info/AUTHORS.txt @@ -0,0 +1,562 @@ +A_Rog +Aakanksha Agrawal <11389424+rasponic@users.noreply.github.com> +Abhinav Sagar <40603139+abhinavsagar@users.noreply.github.com> +ABHYUDAY PRATAP SINGH +abs51295 +AceGentile +Adam Chainz +Adam Tse +Adam Tse +Adam Wentz +admin +Adrien Morison +ahayrapetyan +Ahilya +AinsworthK +Akash Srivastava +Alan Yee +Albert Tugushev +Albert-Guan +albertg +Aleks Bunin +Alethea Flowers +Alex Gaynor +Alex Grönholm +Alex Loosley +Alex Morega +Alex Stachowiak +Alexander Shtyrov +Alexandre Conrad +Alexey Popravka +Alexey Popravka +Alli +Ami Fischman +Ananya Maiti +Anatoly Techtonik +Anders Kaseorg +Andreas Lutro +Andrei Geacar +Andrew Gaul +Andrey Bulgakov +Andrés Delfino <34587441+andresdelfino@users.noreply.github.com> +Andrés Delfino +Andy Freeland +Andy Freeland +Andy Kluger +Ani Hayrapetyan +Aniruddha Basak +Anish Tambe +Anrs Hu +Anthony Sottile +Antoine Musso +Anton Ovchinnikov +Anton Patrushev +Antonio Alvarado Hernandez +Antony Lee +Antti Kaihola +Anubhav Patel +Anuj Godase +AQNOUCH Mohammed +AraHaan +Arindam Choudhury +Armin Ronacher +Artem +Ashley Manton +Ashwin Ramaswami +atse +Atsushi Odagiri +Avner Cohen +Baptiste Mispelon +Barney Gale +barneygale +Bartek Ogryczak +Bastian Venthur +Ben Darnell +Ben Hoyt +Ben Rosser +Bence Nagy +Benjamin Peterson +Benjamin VanEvery +Benoit Pierre +Berker Peksag +Bernardo B. Marques +Bernhard M. Wiedemann +Bertil Hatt +Bogdan Opanchuk +BorisZZZ +Brad Erickson +Bradley Ayers +Brandon L. Reiss +Brandt Bucher +Brett Randall +Brian Cristante <33549821+brcrista@users.noreply.github.com> +Brian Cristante +Brian Rosner +BrownTruck +Bruno Oliveira +Bruno Renié +Bstrdsmkr +Buck Golemon +burrows +Bussonnier Matthias +c22 +Caleb Martinez +Calvin Smith +Carl Meyer +Carlos Liam +Carol Willing +Carter Thayer +Cass +Chandrasekhar Atina +Chih-Hsuan Yen +Chih-Hsuan Yen +Chris Brinker +Chris Hunt +Chris Jerdonek +Chris McDonough +Chris Wolfe +Christian Heimes +Christian Oudard +Christopher Hunt +Christopher Snyder +Clark Boylan +Clay McClure +Cody +Cody Soyland +Colin Watson +Connor Osborn +Cooper Lees +Cooper Ry Lees +Cory Benfield +Cory Wright +Craig Kerstiens +Cristian Sorinel +Curtis Doty +cytolentino +Damian Quiroga +Dan Black +Dan Savilonis +Dan Sully +daniel +Daniel Collins +Daniel Hahler +Daniel Holth +Daniel Jost +Daniel Shaulov +Daniele Esposti +Daniele Procida +Danny Hermes +Dav Clark +Dave Abrahams +Dave Jones +David Aguilar +David Black +David Bordeynik +David Bordeynik +David Caro +David Evans +David Linke +David Pursehouse +David Tucker +David Wales +Davidovich +derwolfe +Desetude +Diego Caraballo +DiegoCaraballo +Dmitry Gladkov +Domen Kožar +Donald Stufft +Dongweiming +Douglas Thor +DrFeathers +Dustin Ingram +Dwayne Bailey +Ed Morley <501702+edmorley@users.noreply.github.com> +Ed Morley +Eitan Adler +ekristina +elainechan +Eli Schwartz +Eli Schwartz +Emil Burzo +Emil Styrke +Endoh Takanao +enoch +Erdinc Mutlu +Eric Gillingham +Eric Hanchrow +Eric Hopper +Erik M. Bray +Erik Rose +Ernest W Durbin III +Ernest W. Durbin III +Erwin Janssen +Eugene Vereshchagin +everdimension +Felix Yan +fiber-space +Filip Kokosiński +Florian Briand +Florian Rathgeber +Francesco +Francesco Montesano +Frost Ming +Gabriel Curio +Gabriel de Perthuis +Garry Polley +gdanielson +Geoffrey Lehée +Geoffrey Sneddon +George Song +Georgi Valkov +Giftlin Rajaiah +gizmoguy1 +gkdoc <40815324+gkdoc@users.noreply.github.com> +Gopinath M <31352222+mgopi1990@users.noreply.github.com> +GOTO Hayato <3532528+gh640@users.noreply.github.com> +gpiks +Guilherme Espada +Guy Rozendorn +gzpan123 +Hanjun Kim +Hari Charan +Harsh Vardhan +Herbert Pfennig +Hsiaoming Yang +Hugo +Hugo Lopes Tavares +Hugo van Kemenade +hugovk +Hynek Schlawack +Ian Bicking +Ian Cordasco +Ian Lee +Ian Stapleton Cordasco +Ian Wienand +Ian Wienand +Igor Kuzmitshov +Igor Sobreira +Ilya Baryshev +INADA Naoki +Ionel Cristian Mărieș +Ionel Maries Cristian +Ivan Pozdeev +Jacob Kim +jakirkham +Jakub Stasiak +Jakub Vysoky +Jakub Wilk +James Cleveland +James Cleveland +James Firth +James Polley +Jan Pokorný +Jannis Leidel +jarondl +Jason R. Coombs +Jay Graves +Jean-Christophe Fillion-Robin +Jeff Barber +Jeff Dairiki +Jelmer Vernooij +jenix21 +Jeremy Stanley +Jeremy Zafran +Jiashuo Li +Jim Garrison +Jivan Amara +John Paton +John-Scott Atlakson +johnthagen +johnthagen +Jon Banafato +Jon Dufresne +Jon Parise +Jonas Nockert +Jonathan Herbert +Joost Molenaar +Jorge Niedbalski +Joseph Long +Josh Bronson +Josh Hansen +Josh Schneier +Juanjo Bazán +Julian Berman +Julian Gethmann +Julien Demoor +jwg4 +Jyrki Pulliainen +Kai Chen +Kamal Bin Mustafa +kaustav haldar +keanemind +Keith Maxwell +Kelsey Hightower +Kenneth Belitzky +Kenneth Reitz +Kenneth Reitz +Kevin Burke +Kevin Carter +Kevin Frommelt +Kevin R Patterson +Kexuan Sun +Kit Randel +kpinc +Krishna Oza +Kumar McMillan +Kyle Persohn +lakshmanaram +Laszlo Kiss-Kollar +Laurent Bristiel +Laurie Opperman +Leon Sasson +Lev Givon +Lincoln de Sousa +Lipis +Loren Carvalho +Lucas Cimon +Ludovic Gasc +Luke Macken +Luo Jiebin +luojiebin +luz.paz +László Kiss Kollár +László Kiss Kollár +Marc Abramowitz +Marc Tamlyn +Marcus Smith +Mariatta +Mark Kohler +Mark Williams +Mark Williams +Markus Hametner +Masaki +Masklinn +Matej Stuchlik +Mathew Jennings +Mathieu Bridon +Matt Good +Matt Maker +Matt Robenolt +matthew +Matthew Einhorn +Matthew Gilliard +Matthew Iversen +Matthew Trumbell +Matthew Willson +Matthias Bussonnier +mattip +Maxim Kurnikov +Maxime Rouyrre +mayeut +mbaluna <44498973+mbaluna@users.noreply.github.com> +mdebi <17590103+mdebi@users.noreply.github.com> +memoselyk +Michael +Michael Aquilina +Michael E. Karpeles +Michael Klich +Michael Williamson +michaelpacer +Mickaël Schoentgen +Miguel Araujo Perez +Mihir Singh +Mike +Mike Hendricks +Min RK +MinRK +Miro Hrončok +Monica Baluna +montefra +Monty Taylor +Nate Coraor +Nathaniel J. Smith +Nehal J Wani +Neil Botelho +Nick Coghlan +Nick Stenning +Nick Timkovich +Nicolas Bock +Nikhil Benesch +Nitesh Sharma +Nowell Strite +NtaleGrey +nvdv +Ofekmeister +ofrinevo +Oliver Jeeves +Oliver Tonnhofer +Olivier Girardot +Olivier Grisel +Ollie Rutherfurd +OMOTO Kenji +Omry Yadan +Oren Held +Oscar Benjamin +Oz N Tiram +Pachwenko <32424503+Pachwenko@users.noreply.github.com> +Patrick Dubroy +Patrick Jenkins +Patrick Lawson +patricktokeeffe +Patrik Kopkan +Paul Kehrer +Paul Moore +Paul Nasrat +Paul Oswald +Paul van der Linden +Paulus Schoutsen +Pavithra Eswaramoorthy <33131404+QueenCoffee@users.noreply.github.com> +Pawel Jasinski +Pekka Klärck +Peter Lisák +Peter Waller +petr-tik +Phaneendra Chiruvella +Phil Freo +Phil Pennock +Phil Whelan +Philip Jägenstedt +Philip Molloy +Philippe Ombredanne +Pi Delport +Pierre-Yves Rofes +pip +Prabakaran Kumaresshan +Prabhjyotsing Surjit Singh Sodhi +Prabhu Marappan +Pradyun Gedam +Pratik Mallya +Preet Thakkar +Preston Holmes +Przemek Wrzos +Pulkit Goyal <7895pulkit@gmail.com> +Qiangning Hong +Quentin Pradet +R. David Murray +Rafael Caricio +Ralf Schmitt +Razzi Abuissa +rdb +Remi Rampin +Remi Rampin +Rene Dudfield +Riccardo Magliocchetti +Richard Jones +RobberPhex +Robert Collins +Robert McGibbon +Robert T. McGibbon +robin elisha robinson +Roey Berman +Rohan Jain +Rohan Jain +Rohan Jain +Roman Bogorodskiy +Romuald Brunet +Ronny Pfannschmidt +Rory McCann +Ross Brattain +Roy Wellington Ⅳ +Roy Wellington Ⅳ +Ryan Wooden +ryneeverett +Sachi King +Salvatore Rinchiera +Savio Jomton +schlamar +Scott Kitterman +Sean +seanj +Sebastian Jordan +Sebastian Schaetz +Segev Finer +SeongSoo Cho +Sergey Vasilyev +Seth Woodworth +Shlomi Fish +Shovan Maity +Simeon Visser +Simon Cross +Simon Pichugin +sinoroc +Sorin Sbarnea +Stavros Korokithakis +Stefan Scherfke +Stephan Erb +stepshal +Steve (Gadget) Barnes +Steve Barnes +Steve Dower +Steve Kowalik +Steven Myint +stonebig +Stéphane Bidoul (ACSONE) +Stéphane Bidoul +Stéphane Klein +Sumana Harihareswara +Sviatoslav Sydorenko +Sviatoslav Sydorenko +Swat009 +Takayuki SHIMIZUKAWA +tbeswick +Thijs Triemstra +Thomas Fenzl +Thomas Grainger +Thomas Guettler +Thomas Johansson +Thomas Kluyver +Thomas Smith +Tim D. Smith +Tim Gates +Tim Harder +Tim Heap +tim smith +tinruufu +Tom Forbes +Tom Freudenheim +Tom V +Tomas Orsava +Tomer Chachamu +Tony Beswick +Tony Zhaocheng Tan +TonyBeswick +toonarmycaptain +Toshio Kuratomi +Travis Swicegood +Tzu-ping Chung +Valentin Haenel +Victor Stinner +victorvpaulo +Viktor Szépe +Ville Skyttä +Vinay Sajip +Vincent Philippon +Vinicyus Macedo <7549205+vinicyusmacedo@users.noreply.github.com> +Vitaly Babiy +Vladimir Rutsky +W. Trevor King +Wil Tan +Wilfred Hughes +William ML Leslie +William T Olson +Wilson Mo +wim glenn +Wolfgang Maier +Xavier Fernandez +Xavier Fernandez +xoviat +xtreak +YAMAMOTO Takashi +Yen Chi Hsuan +Yeray Diaz Diaz +Yoval P +Yu Jian +Yuan Jing Vincent Yan +Zearin +Zearin +Zhiping Deng +Zvezdan Petkovic +Łukasz Langa +Семён Марьясин diff --git a/cres/venv/lib/python3.8/site-packages/distro-1.4.0.dist-info/INSTALLER b/cres/venv/lib/python3.8/site-packages/distro-1.4.0.dist-info/INSTALLER new file mode 100644 index 000000000..a1b589e38 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/distro-1.4.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/cres/venv/lib/python3.8/site-packages/distro-1.4.0.dist-info/LICENSE.txt b/cres/venv/lib/python3.8/site-packages/distro-1.4.0.dist-info/LICENSE.txt new file mode 100644 index 000000000..737fec5c5 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/distro-1.4.0.dist-info/LICENSE.txt @@ -0,0 +1,20 @@ +Copyright (c) 2008-2019 The pip developers (see AUTHORS.txt file) + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/cres/venv/lib/python3.8/site-packages/distro-1.4.0.dist-info/METADATA b/cres/venv/lib/python3.8/site-packages/distro-1.4.0.dist-info/METADATA new file mode 100644 index 000000000..b34cf6205 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/distro-1.4.0.dist-info/METADATA @@ -0,0 +1,170 @@ +Metadata-Version: 2.1 +Name: distro +Version: 1.4.0 +Summary: Distro - an OS platform information API +Home-page: https://github.com/nir0s/distro +Author: Nir Cohen +Author-email: nir36g@gmail.com +License: Apache License, Version 2.0 +Platform: All +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Intended Audience :: System Administrators +Classifier: License :: OSI Approved :: Apache Software License +Classifier: Operating System :: POSIX :: Linux +Classifier: Operating System :: POSIX :: BSD +Classifier: Operating System :: POSIX :: BSD :: FreeBSD +Classifier: Operating System :: POSIX :: BSD :: NetBSD +Classifier: Operating System :: POSIX :: BSD :: OpenBSD +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: System :: Operating System +Description-Content-Type: text/markdown + +Distro - an OS platform information API +======================================= + +[![Build Status](https://travis-ci.org/nir0s/distro.svg?branch=master)](https://travis-ci.org/nir0s/distro) +[![Build status](https://ci.appveyor.com/api/projects/status/e812qjk1gf0f74r5/branch/master?svg=true)](https://ci.appveyor.com/project/nir0s/distro/branch/master) +[![PyPI version](http://img.shields.io/pypi/v/distro.svg)](https://pypi.python.org/pypi/distro) +[![Supported Python Versions](https://img.shields.io/pypi/pyversions/distro.svg)](https://img.shields.io/pypi/pyversions/distro.svg) +[![Requirements Status](https://requires.io/github/nir0s/distro/requirements.svg?branch=master)](https://requires.io/github/nir0s/distro/requirements/?branch=master) +[![Code Coverage](https://codecov.io/github/nir0s/distro/coverage.svg?branch=master)](https://codecov.io/github/nir0s/distro?branch=master) +[![Code Quality](https://landscape.io/github/nir0s/distro/master/landscape.svg?style=flat)](https://landscape.io/github/nir0s/distro) +[![Is Wheel](https://img.shields.io/pypi/wheel/distro.svg?style=flat)](https://pypi.python.org/pypi/distro) +[![Latest Github Release](https://readthedocs.org/projects/distro/badge/?version=stable)](http://distro.readthedocs.io/en/latest/) +[![Join the chat at https://gitter.im/nir0s/distro](https://badges.gitter.im/nir0s/distro.svg)](https://gitter.im/nir0s/distro?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) + +`distro` provides information about the +OS distribution it runs on, such as a reliable machine-readable ID, or +version information. + +It is the recommended replacement for Python's original +[`platform.linux_distribution`](https://docs.python.org/3.7/library/platform.html#platform.linux_distribution) +function (which will be removed in Python 3.8). +It also provides much more functionality which isn't necessarily Python bound, +like a command-line interface. + +Distro currently supports Linux and BSD based systems but [Windows and OS X support](https://github.com/nir0s/distro/issues/177) is also planned. + +For Python 2.6 support, see https://github.com/nir0s/distro/tree/python2.6-support + +## Installation + +Installation of the latest released version from PyPI: + +```shell +pip install distro +``` + +Installation of the latest development version: + +```shell +pip install https://github.com/nir0s/distro/archive/master.tar.gz +``` + + +## Usage + +```bash +$ distro +Name: Antergos Linux +Version: 2015.10 (ISO-Rolling) +Codename: ISO-Rolling + +$ distro -j +{ + "codename": "ISO-Rolling", + "id": "antergos", + "like": "arch", + "version": "16.9", + "version_parts": { + "build_number": "", + "major": "16", + "minor": "9" + } +} + + +$ python +>>> import distro +>>> distro.linux_distribution(full_distribution_name=False) +('centos', '7.1.1503', 'Core') +``` + + +## Documentation + +On top of the aforementioned API, several more functions are available. For a complete description of the +API, see the [latest API documentation](http://distro.readthedocs.org/en/latest/). + +## Background + +An alternative implementation became necessary because Python 3.5 deprecated +this function, and Python 3.8 will remove it altogether. +Its predecessor function `platform.dist` was already deprecated since +Python 2.6 and will also be removed in Python 3.8. +Still, there are many cases in which access to that information is needed. +See [Python issue 1322](https://bugs.python.org/issue1322) for more +information. + +The `distro` package implements a robust and inclusive way of retrieving the +information about a distribution based on new standards and old methods, +namely from these data sources (from high to low precedence): + +* The os-release file `/etc/os-release`, if present. +* The output of the `lsb_release` command, if available. +* The distro release file (`/etc/*(-|_)(release|version)`), if present. +* The `uname` command for BSD based distrubtions. + + +## Python and Distribution Support + +`distro` is supported and tested on Python 2.7, 3.4+ and PyPy and on +any distribution that provides one or more of the data sources +covered. + +This package is tested with test data that mimics the exact behavior of the data sources of [a number of Linux distributions](https://github.com/nir0s/distro/tree/master/tests/resources/distros). + + +## Testing + +```shell +git clone git@github.com:nir0s/distro.git +cd distro +pip install tox +tox +``` + + +## Contributions + +Pull requests are always welcome to deal with specific distributions or just +for general merriment. + +See [CONTRIBUTIONS](https://github.com/nir0s/distro/blob/master/CONTRIBUTING.md) for contribution info. + +Reference implementations for supporting additional distributions and file +formats can be found here: + +* https://github.com/saltstack/salt/blob/develop/salt/grains/core.py#L1172 +* https://github.com/chef/ohai/blob/master/lib/ohai/plugins/linux/platform.rb +* https://github.com/ansible/ansible/blob/devel/lib/ansible/module_utils/facts/system/distribution.py +* https://github.com/puppetlabs/facter/blob/master/lib/src/facts/linux/os_linux.cc + +## Package manager distributions + +* https://src.fedoraproject.org/rpms/python-distro +* https://www.archlinux.org/packages/community/any/python-distro/ +* https://launchpad.net/ubuntu/+source/python-distro +* https://packages.debian.org/sid/python-distro +* https://packages.gentoo.org/packages/dev-python/distro +* https://pkgs.org/download/python2-distro +* https://slackbuilds.org/repository/14.2/python/python-distro/ + + diff --git a/cres/venv/lib/python3.8/site-packages/distro-1.4.0.dist-info/RECORD b/cres/venv/lib/python3.8/site-packages/distro-1.4.0.dist-info/RECORD new file mode 100644 index 000000000..2a8bfa320 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/distro-1.4.0.dist-info/RECORD @@ -0,0 +1,15 @@ +distro.py,sha256=X2So5kjrRKyMbQJ90Xgy93HU5eFtujCzKaYNeoy1k1c,43251 +distro-1.4.0.dist-info/AUTHORS.txt,sha256=RtqU9KfonVGhI48DAA4-yTOBUhBtQTjFhaDzHoyh7uU,21518 +distro-1.4.0.dist-info/LICENSE.txt,sha256=W6Ifuwlk-TatfRU2LR7W1JMcyMj5_y1NkRkOEJvnRDE,1090 +distro-1.4.0.dist-info/METADATA,sha256=7u13dPkDA9zu5ahg3Ns-H2vfMpR6gBBS55EaBzlXIeg,6648 +distro-1.4.0.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110 +distro-1.4.0.dist-info/entry_points.txt,sha256=mDMyvS_AzB0WhRYe_6xrRkAAET1LwFiDTL5Sx57UFiY,40 +distro-1.4.0.dist-info/top_level.txt,sha256=ikde_V_XEdSBqaGd5tEriN_wzYHLgTX_zVtlsGLHvwQ,7 +distro-1.4.0.dist-info/RECORD,, +../../../bin/distro-3.8,, +../../../bin/distro3,, +distro-1.4.0.dist-info/INSTALLER,, +distro-1.4.0.virtualenv,, +distro-1.4.0.dist-info/__pycache__,, +../../../bin/distro,, +distro.cpython-38.pyc,, \ No newline at end of file diff --git a/cres/venv/lib/python3.8/site-packages/distro-1.4.0.dist-info/WHEEL b/cres/venv/lib/python3.8/site-packages/distro-1.4.0.dist-info/WHEEL new file mode 100644 index 000000000..ef99c6cf3 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/distro-1.4.0.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.34.2) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/cres/venv/lib/python3.8/site-packages/distro-1.4.0.dist-info/entry_points.txt b/cres/venv/lib/python3.8/site-packages/distro-1.4.0.dist-info/entry_points.txt new file mode 100644 index 000000000..dd4023997 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/distro-1.4.0.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[console_scripts] +distro = distro:main + diff --git a/cres/venv/lib/python3.8/site-packages/distro-1.4.0.dist-info/top_level.txt b/cres/venv/lib/python3.8/site-packages/distro-1.4.0.dist-info/top_level.txt new file mode 100644 index 000000000..0e0933171 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/distro-1.4.0.dist-info/top_level.txt @@ -0,0 +1 @@ +distro diff --git a/cres/venv/lib/python3.8/site-packages/distro-1.4.0.virtualenv b/cres/venv/lib/python3.8/site-packages/distro-1.4.0.virtualenv new file mode 100644 index 000000000..e69de29bb diff --git a/cres/venv/lib/python3.8/site-packages/distro.py b/cres/venv/lib/python3.8/site-packages/distro.py new file mode 100644 index 000000000..33061633e --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/distro.py @@ -0,0 +1,1216 @@ +# Copyright 2015,2016,2017 Nir Cohen +# +# 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. + +""" +The ``distro`` package (``distro`` stands for Linux Distribution) provides +information about the Linux distribution it runs on, such as a reliable +machine-readable distro ID, or version information. + +It is the recommended replacement for Python's original +:py:func:`platform.linux_distribution` function, but it provides much more +functionality. An alternative implementation became necessary because Python +3.5 deprecated this function, and Python 3.8 will remove it altogether. +Its predecessor function :py:func:`platform.dist` was already +deprecated since Python 2.6 and will also be removed in Python 3.8. +Still, there are many cases in which access to OS distribution information +is needed. See `Python issue 1322 `_ for +more information. +""" + +import os +import re +import sys +import json +import shlex +import logging +import argparse +import subprocess + + +_UNIXCONFDIR = os.environ.get('UNIXCONFDIR', '/etc') +_OS_RELEASE_BASENAME = 'os-release' + +#: Translation table for normalizing the "ID" attribute defined in os-release +#: files, for use by the :func:`distro.id` method. +#: +#: * Key: Value as defined in the os-release file, translated to lower case, +#: with blanks translated to underscores. +#: +#: * Value: Normalized value. +NORMALIZED_OS_ID = { + 'ol': 'oracle', # Oracle Enterprise Linux +} + +#: Translation table for normalizing the "Distributor ID" attribute returned by +#: the lsb_release command, for use by the :func:`distro.id` method. +#: +#: * Key: Value as returned by the lsb_release command, translated to lower +#: case, with blanks translated to underscores. +#: +#: * Value: Normalized value. +NORMALIZED_LSB_ID = { + 'enterpriseenterprise': 'oracle', # Oracle Enterprise Linux + 'redhatenterpriseworkstation': 'rhel', # RHEL 6, 7 Workstation + 'redhatenterpriseserver': 'rhel', # RHEL 6, 7 Server +} + +#: Translation table for normalizing the distro ID derived from the file name +#: of distro release files, for use by the :func:`distro.id` method. +#: +#: * Key: Value as derived from the file name of a distro release file, +#: translated to lower case, with blanks translated to underscores. +#: +#: * Value: Normalized value. +NORMALIZED_DISTRO_ID = { + 'redhat': 'rhel', # RHEL 6.x, 7.x +} + +# Pattern for content of distro release file (reversed) +_DISTRO_RELEASE_CONTENT_REVERSED_PATTERN = re.compile( + r'(?:[^)]*\)(.*)\()? *(?:STL )?([\d.+\-a-z]*\d) *(?:esaeler *)?(.+)') + +# Pattern for base file name of distro release file +_DISTRO_RELEASE_BASENAME_PATTERN = re.compile( + r'(\w+)[-_](release|version)$') + +# Base file names to be ignored when searching for distro release file +_DISTRO_RELEASE_IGNORE_BASENAMES = ( + 'debian_version', + 'lsb-release', + 'oem-release', + _OS_RELEASE_BASENAME, + 'system-release' +) + + +def linux_distribution(full_distribution_name=True): + """ + Return information about the current OS distribution as a tuple + ``(id_name, version, codename)`` with items as follows: + + * ``id_name``: If *full_distribution_name* is false, the result of + :func:`distro.id`. Otherwise, the result of :func:`distro.name`. + + * ``version``: The result of :func:`distro.version`. + + * ``codename``: The result of :func:`distro.codename`. + + The interface of this function is compatible with the original + :py:func:`platform.linux_distribution` function, supporting a subset of + its parameters. + + The data it returns may not exactly be the same, because it uses more data + sources than the original function, and that may lead to different data if + the OS distribution is not consistent across multiple data sources it + provides (there are indeed such distributions ...). + + Another reason for differences is the fact that the :func:`distro.id` + method normalizes the distro ID string to a reliable machine-readable value + for a number of popular OS distributions. + """ + return _distro.linux_distribution(full_distribution_name) + + +def id(): + """ + Return the distro ID of the current distribution, as a + machine-readable string. + + For a number of OS distributions, the returned distro ID value is + *reliable*, in the sense that it is documented and that it does not change + across releases of the distribution. + + This package maintains the following reliable distro ID values: + + ============== ========================================= + Distro ID Distribution + ============== ========================================= + "ubuntu" Ubuntu + "debian" Debian + "rhel" RedHat Enterprise Linux + "centos" CentOS + "fedora" Fedora + "sles" SUSE Linux Enterprise Server + "opensuse" openSUSE + "amazon" Amazon Linux + "arch" Arch Linux + "cloudlinux" CloudLinux OS + "exherbo" Exherbo Linux + "gentoo" GenToo Linux + "ibm_powerkvm" IBM PowerKVM + "kvmibm" KVM for IBM z Systems + "linuxmint" Linux Mint + "mageia" Mageia + "mandriva" Mandriva Linux + "parallels" Parallels + "pidora" Pidora + "raspbian" Raspbian + "oracle" Oracle Linux (and Oracle Enterprise Linux) + "scientific" Scientific Linux + "slackware" Slackware + "xenserver" XenServer + "openbsd" OpenBSD + "netbsd" NetBSD + "freebsd" FreeBSD + ============== ========================================= + + If you have a need to get distros for reliable IDs added into this set, + or if you find that the :func:`distro.id` function returns a different + distro ID for one of the listed distros, please create an issue in the + `distro issue tracker`_. + + **Lookup hierarchy and transformations:** + + First, the ID is obtained from the following sources, in the specified + order. The first available and non-empty value is used: + + * the value of the "ID" attribute of the os-release file, + + * the value of the "Distributor ID" attribute returned by the lsb_release + command, + + * the first part of the file name of the distro release file, + + The so determined ID value then passes the following transformations, + before it is returned by this method: + + * it is translated to lower case, + + * blanks (which should not be there anyway) are translated to underscores, + + * a normalization of the ID is performed, based upon + `normalization tables`_. The purpose of this normalization is to ensure + that the ID is as reliable as possible, even across incompatible changes + in the OS distributions. A common reason for an incompatible change is + the addition of an os-release file, or the addition of the lsb_release + command, with ID values that differ from what was previously determined + from the distro release file name. + """ + return _distro.id() + + +def name(pretty=False): + """ + Return the name of the current OS distribution, as a human-readable + string. + + If *pretty* is false, the name is returned without version or codename. + (e.g. "CentOS Linux") + + If *pretty* is true, the version and codename are appended. + (e.g. "CentOS Linux 7.1.1503 (Core)") + + **Lookup hierarchy:** + + The name is obtained from the following sources, in the specified order. + The first available and non-empty value is used: + + * If *pretty* is false: + + - the value of the "NAME" attribute of the os-release file, + + - the value of the "Distributor ID" attribute returned by the lsb_release + command, + + - the value of the "" field of the distro release file. + + * If *pretty* is true: + + - the value of the "PRETTY_NAME" attribute of the os-release file, + + - the value of the "Description" attribute returned by the lsb_release + command, + + - the value of the "" field of the distro release file, appended + with the value of the pretty version ("" and "" + fields) of the distro release file, if available. + """ + return _distro.name(pretty) + + +def version(pretty=False, best=False): + """ + Return the version of the current OS distribution, as a human-readable + string. + + If *pretty* is false, the version is returned without codename (e.g. + "7.0"). + + If *pretty* is true, the codename in parenthesis is appended, if the + codename is non-empty (e.g. "7.0 (Maipo)"). + + Some distributions provide version numbers with different precisions in + the different sources of distribution information. Examining the different + sources in a fixed priority order does not always yield the most precise + version (e.g. for Debian 8.2, or CentOS 7.1). + + The *best* parameter can be used to control the approach for the returned + version: + + If *best* is false, the first non-empty version number in priority order of + the examined sources is returned. + + If *best* is true, the most precise version number out of all examined + sources is returned. + + **Lookup hierarchy:** + + In all cases, the version number is obtained from the following sources. + If *best* is false, this order represents the priority order: + + * the value of the "VERSION_ID" attribute of the os-release file, + * the value of the "Release" attribute returned by the lsb_release + command, + * the version number parsed from the "" field of the first line + of the distro release file, + * the version number parsed from the "PRETTY_NAME" attribute of the + os-release file, if it follows the format of the distro release files. + * the version number parsed from the "Description" attribute returned by + the lsb_release command, if it follows the format of the distro release + files. + """ + return _distro.version(pretty, best) + + +def version_parts(best=False): + """ + Return the version of the current OS distribution as a tuple + ``(major, minor, build_number)`` with items as follows: + + * ``major``: The result of :func:`distro.major_version`. + + * ``minor``: The result of :func:`distro.minor_version`. + + * ``build_number``: The result of :func:`distro.build_number`. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.version_parts(best) + + +def major_version(best=False): + """ + Return the major version of the current OS distribution, as a string, + if provided. + Otherwise, the empty string is returned. The major version is the first + part of the dot-separated version string. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.major_version(best) + + +def minor_version(best=False): + """ + Return the minor version of the current OS distribution, as a string, + if provided. + Otherwise, the empty string is returned. The minor version is the second + part of the dot-separated version string. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.minor_version(best) + + +def build_number(best=False): + """ + Return the build number of the current OS distribution, as a string, + if provided. + Otherwise, the empty string is returned. The build number is the third part + of the dot-separated version string. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.build_number(best) + + +def like(): + """ + Return a space-separated list of distro IDs of distributions that are + closely related to the current OS distribution in regards to packaging + and programming interfaces, for example distributions the current + distribution is a derivative from. + + **Lookup hierarchy:** + + This information item is only provided by the os-release file. + For details, see the description of the "ID_LIKE" attribute in the + `os-release man page + `_. + """ + return _distro.like() + + +def codename(): + """ + Return the codename for the release of the current OS distribution, + as a string. + + If the distribution does not have a codename, an empty string is returned. + + Note that the returned codename is not always really a codename. For + example, openSUSE returns "x86_64". This function does not handle such + cases in any special way and just returns the string it finds, if any. + + **Lookup hierarchy:** + + * the codename within the "VERSION" attribute of the os-release file, if + provided, + + * the value of the "Codename" attribute returned by the lsb_release + command, + + * the value of the "" field of the distro release file. + """ + return _distro.codename() + + +def info(pretty=False, best=False): + """ + Return certain machine-readable information items about the current OS + distribution in a dictionary, as shown in the following example: + + .. sourcecode:: python + + { + 'id': 'rhel', + 'version': '7.0', + 'version_parts': { + 'major': '7', + 'minor': '0', + 'build_number': '' + }, + 'like': 'fedora', + 'codename': 'Maipo' + } + + The dictionary structure and keys are always the same, regardless of which + information items are available in the underlying data sources. The values + for the various keys are as follows: + + * ``id``: The result of :func:`distro.id`. + + * ``version``: The result of :func:`distro.version`. + + * ``version_parts -> major``: The result of :func:`distro.major_version`. + + * ``version_parts -> minor``: The result of :func:`distro.minor_version`. + + * ``version_parts -> build_number``: The result of + :func:`distro.build_number`. + + * ``like``: The result of :func:`distro.like`. + + * ``codename``: The result of :func:`distro.codename`. + + For a description of the *pretty* and *best* parameters, see the + :func:`distro.version` method. + """ + return _distro.info(pretty, best) + + +def os_release_info(): + """ + Return a dictionary containing key-value pairs for the information items + from the os-release file data source of the current OS distribution. + + See `os-release file`_ for details about these information items. + """ + return _distro.os_release_info() + + +def lsb_release_info(): + """ + Return a dictionary containing key-value pairs for the information items + from the lsb_release command data source of the current OS distribution. + + See `lsb_release command output`_ for details about these information + items. + """ + return _distro.lsb_release_info() + + +def distro_release_info(): + """ + Return a dictionary containing key-value pairs for the information items + from the distro release file data source of the current OS distribution. + + See `distro release file`_ for details about these information items. + """ + return _distro.distro_release_info() + + +def uname_info(): + """ + Return a dictionary containing key-value pairs for the information items + from the distro release file data source of the current OS distribution. + """ + return _distro.uname_info() + + +def os_release_attr(attribute): + """ + Return a single named information item from the os-release file data source + of the current OS distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + + See `os-release file`_ for details about these information items. + """ + return _distro.os_release_attr(attribute) + + +def lsb_release_attr(attribute): + """ + Return a single named information item from the lsb_release command output + data source of the current OS distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + + See `lsb_release command output`_ for details about these information + items. + """ + return _distro.lsb_release_attr(attribute) + + +def distro_release_attr(attribute): + """ + Return a single named information item from the distro release file + data source of the current OS distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + + See `distro release file`_ for details about these information items. + """ + return _distro.distro_release_attr(attribute) + + +def uname_attr(attribute): + """ + Return a single named information item from the distro release file + data source of the current OS distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + """ + return _distro.uname_attr(attribute) + + +class cached_property(object): + """A version of @property which caches the value. On access, it calls the + underlying function and sets the value in `__dict__` so future accesses + will not re-call the property. + """ + def __init__(self, f): + self._fname = f.__name__ + self._f = f + + def __get__(self, obj, owner): + assert obj is not None, 'call {} on an instance'.format(self._fname) + ret = obj.__dict__[self._fname] = self._f(obj) + return ret + + +class LinuxDistribution(object): + """ + Provides information about a OS distribution. + + This package creates a private module-global instance of this class with + default initialization arguments, that is used by the + `consolidated accessor functions`_ and `single source accessor functions`_. + By using default initialization arguments, that module-global instance + returns data about the current OS distribution (i.e. the distro this + package runs on). + + Normally, it is not necessary to create additional instances of this class. + However, in situations where control is needed over the exact data sources + that are used, instances of this class can be created with a specific + distro release file, or a specific os-release file, or without invoking the + lsb_release command. + """ + + def __init__(self, + include_lsb=True, + os_release_file='', + distro_release_file='', + include_uname=True): + """ + The initialization method of this class gathers information from the + available data sources, and stores that in private instance attributes. + Subsequent access to the information items uses these private instance + attributes, so that the data sources are read only once. + + Parameters: + + * ``include_lsb`` (bool): Controls whether the + `lsb_release command output`_ is included as a data source. + + If the lsb_release command is not available in the program execution + path, the data source for the lsb_release command will be empty. + + * ``os_release_file`` (string): The path name of the + `os-release file`_ that is to be used as a data source. + + An empty string (the default) will cause the default path name to + be used (see `os-release file`_ for details). + + If the specified or defaulted os-release file does not exist, the + data source for the os-release file will be empty. + + * ``distro_release_file`` (string): The path name of the + `distro release file`_ that is to be used as a data source. + + An empty string (the default) will cause a default search algorithm + to be used (see `distro release file`_ for details). + + If the specified distro release file does not exist, or if no default + distro release file can be found, the data source for the distro + release file will be empty. + + * ``include_name`` (bool): Controls whether uname command output is + included as a data source. If the uname command is not available in + the program execution path the data source for the uname command will + be empty. + + Public instance attributes: + + * ``os_release_file`` (string): The path name of the + `os-release file`_ that is actually used as a data source. The + empty string if no distro release file is used as a data source. + + * ``distro_release_file`` (string): The path name of the + `distro release file`_ that is actually used as a data source. The + empty string if no distro release file is used as a data source. + + * ``include_lsb`` (bool): The result of the ``include_lsb`` parameter. + This controls whether the lsb information will be loaded. + + * ``include_uname`` (bool): The result of the ``include_uname`` + parameter. This controls whether the uname information will + be loaded. + + Raises: + + * :py:exc:`IOError`: Some I/O issue with an os-release file or distro + release file. + + * :py:exc:`subprocess.CalledProcessError`: The lsb_release command had + some issue (other than not being available in the program execution + path). + + * :py:exc:`UnicodeError`: A data source has unexpected characters or + uses an unexpected encoding. + """ + self.os_release_file = os_release_file or \ + os.path.join(_UNIXCONFDIR, _OS_RELEASE_BASENAME) + self.distro_release_file = distro_release_file or '' # updated later + self.include_lsb = include_lsb + self.include_uname = include_uname + + def __repr__(self): + """Return repr of all info + """ + return \ + "LinuxDistribution(" \ + "os_release_file={self.os_release_file!r}, " \ + "distro_release_file={self.distro_release_file!r}, " \ + "include_lsb={self.include_lsb!r}, " \ + "include_uname={self.include_uname!r}, " \ + "_os_release_info={self._os_release_info!r}, " \ + "_lsb_release_info={self._lsb_release_info!r}, " \ + "_distro_release_info={self._distro_release_info!r}, " \ + "_uname_info={self._uname_info!r})".format( + self=self) + + def linux_distribution(self, full_distribution_name=True): + """ + Return information about the OS distribution that is compatible + with Python's :func:`platform.linux_distribution`, supporting a subset + of its parameters. + + For details, see :func:`distro.linux_distribution`. + """ + return ( + self.name() if full_distribution_name else self.id(), + self.version(), + self.codename() + ) + + def id(self): + """Return the distro ID of the OS distribution, as a string. + + For details, see :func:`distro.id`. + """ + def normalize(distro_id, table): + distro_id = distro_id.lower().replace(' ', '_') + return table.get(distro_id, distro_id) + + distro_id = self.os_release_attr('id') + if distro_id: + return normalize(distro_id, NORMALIZED_OS_ID) + + distro_id = self.lsb_release_attr('distributor_id') + if distro_id: + return normalize(distro_id, NORMALIZED_LSB_ID) + + distro_id = self.distro_release_attr('id') + if distro_id: + return normalize(distro_id, NORMALIZED_DISTRO_ID) + + distro_id = self.uname_attr('id') + if distro_id: + return normalize(distro_id, NORMALIZED_DISTRO_ID) + + return '' + + def name(self, pretty=False): + """ + Return the name of the OS distribution, as a string. + + For details, see :func:`distro.name`. + """ + name = self.os_release_attr('name') \ + or self.lsb_release_attr('distributor_id') \ + or self.distro_release_attr('name') \ + or self.uname_attr('name') + if pretty: + name = self.os_release_attr('pretty_name') \ + or self.lsb_release_attr('description') + if not name: + name = self.distro_release_attr('name') \ + or self.uname_attr('name') + version = self.version(pretty=True) + if version: + name = name + ' ' + version + return name or '' + + def version(self, pretty=False, best=False): + """ + Return the version of the OS distribution, as a string. + + For details, see :func:`distro.version`. + """ + versions = [ + self.os_release_attr('version_id'), + self.lsb_release_attr('release'), + self.distro_release_attr('version_id'), + self._parse_distro_release_content( + self.os_release_attr('pretty_name')).get('version_id', ''), + self._parse_distro_release_content( + self.lsb_release_attr('description')).get('version_id', ''), + self.uname_attr('release') + ] + version = '' + if best: + # This algorithm uses the last version in priority order that has + # the best precision. If the versions are not in conflict, that + # does not matter; otherwise, using the last one instead of the + # first one might be considered a surprise. + for v in versions: + if v.count(".") > version.count(".") or version == '': + version = v + else: + for v in versions: + if v != '': + version = v + break + if pretty and version and self.codename(): + version = u'{0} ({1})'.format(version, self.codename()) + return version + + def version_parts(self, best=False): + """ + Return the version of the OS distribution, as a tuple of version + numbers. + + For details, see :func:`distro.version_parts`. + """ + version_str = self.version(best=best) + if version_str: + version_regex = re.compile(r'(\d+)\.?(\d+)?\.?(\d+)?') + matches = version_regex.match(version_str) + if matches: + major, minor, build_number = matches.groups() + return major, minor or '', build_number or '' + return '', '', '' + + def major_version(self, best=False): + """ + Return the major version number of the current distribution. + + For details, see :func:`distro.major_version`. + """ + return self.version_parts(best)[0] + + def minor_version(self, best=False): + """ + Return the minor version number of the current distribution. + + For details, see :func:`distro.minor_version`. + """ + return self.version_parts(best)[1] + + def build_number(self, best=False): + """ + Return the build number of the current distribution. + + For details, see :func:`distro.build_number`. + """ + return self.version_parts(best)[2] + + def like(self): + """ + Return the IDs of distributions that are like the OS distribution. + + For details, see :func:`distro.like`. + """ + return self.os_release_attr('id_like') or '' + + def codename(self): + """ + Return the codename of the OS distribution. + + For details, see :func:`distro.codename`. + """ + try: + # Handle os_release specially since distros might purposefully set + # this to empty string to have no codename + return self._os_release_info['codename'] + except KeyError: + return self.lsb_release_attr('codename') \ + or self.distro_release_attr('codename') \ + or '' + + def info(self, pretty=False, best=False): + """ + Return certain machine-readable information about the OS + distribution. + + For details, see :func:`distro.info`. + """ + return dict( + id=self.id(), + version=self.version(pretty, best), + version_parts=dict( + major=self.major_version(best), + minor=self.minor_version(best), + build_number=self.build_number(best) + ), + like=self.like(), + codename=self.codename(), + ) + + def os_release_info(self): + """ + Return a dictionary containing key-value pairs for the information + items from the os-release file data source of the OS distribution. + + For details, see :func:`distro.os_release_info`. + """ + return self._os_release_info + + def lsb_release_info(self): + """ + Return a dictionary containing key-value pairs for the information + items from the lsb_release command data source of the OS + distribution. + + For details, see :func:`distro.lsb_release_info`. + """ + return self._lsb_release_info + + def distro_release_info(self): + """ + Return a dictionary containing key-value pairs for the information + items from the distro release file data source of the OS + distribution. + + For details, see :func:`distro.distro_release_info`. + """ + return self._distro_release_info + + def uname_info(self): + """ + Return a dictionary containing key-value pairs for the information + items from the uname command data source of the OS distribution. + + For details, see :func:`distro.uname_info`. + """ + return self._uname_info + + def os_release_attr(self, attribute): + """ + Return a single named information item from the os-release file data + source of the OS distribution. + + For details, see :func:`distro.os_release_attr`. + """ + return self._os_release_info.get(attribute, '') + + def lsb_release_attr(self, attribute): + """ + Return a single named information item from the lsb_release command + output data source of the OS distribution. + + For details, see :func:`distro.lsb_release_attr`. + """ + return self._lsb_release_info.get(attribute, '') + + def distro_release_attr(self, attribute): + """ + Return a single named information item from the distro release file + data source of the OS distribution. + + For details, see :func:`distro.distro_release_attr`. + """ + return self._distro_release_info.get(attribute, '') + + def uname_attr(self, attribute): + """ + Return a single named information item from the uname command + output data source of the OS distribution. + + For details, see :func:`distro.uname_release_attr`. + """ + return self._uname_info.get(attribute, '') + + @cached_property + def _os_release_info(self): + """ + Get the information items from the specified os-release file. + + Returns: + A dictionary containing all information items. + """ + if os.path.isfile(self.os_release_file): + with open(self.os_release_file) as release_file: + return self._parse_os_release_content(release_file) + return {} + + @staticmethod + def _parse_os_release_content(lines): + """ + Parse the lines of an os-release file. + + Parameters: + + * lines: Iterable through the lines in the os-release file. + Each line must be a unicode string or a UTF-8 encoded byte + string. + + Returns: + A dictionary containing all information items. + """ + props = {} + lexer = shlex.shlex(lines, posix=True) + lexer.whitespace_split = True + + # The shlex module defines its `wordchars` variable using literals, + # making it dependent on the encoding of the Python source file. + # In Python 2.6 and 2.7, the shlex source file is encoded in + # 'iso-8859-1', and the `wordchars` variable is defined as a byte + # string. This causes a UnicodeDecodeError to be raised when the + # parsed content is a unicode object. The following fix resolves that + # (... but it should be fixed in shlex...): + if sys.version_info[0] == 2 and isinstance(lexer.wordchars, bytes): + lexer.wordchars = lexer.wordchars.decode('iso-8859-1') + + tokens = list(lexer) + for token in tokens: + # At this point, all shell-like parsing has been done (i.e. + # comments processed, quotes and backslash escape sequences + # processed, multi-line values assembled, trailing newlines + # stripped, etc.), so the tokens are now either: + # * variable assignments: var=value + # * commands or their arguments (not allowed in os-release) + if '=' in token: + k, v = token.split('=', 1) + if isinstance(v, bytes): + v = v.decode('utf-8') + props[k.lower()] = v + else: + # Ignore any tokens that are not variable assignments + pass + + if 'version_codename' in props: + # os-release added a version_codename field. Use that in + # preference to anything else Note that some distros purposefully + # do not have code names. They should be setting + # version_codename="" + props['codename'] = props['version_codename'] + elif 'ubuntu_codename' in props: + # Same as above but a non-standard field name used on older Ubuntus + props['codename'] = props['ubuntu_codename'] + elif 'version' in props: + # If there is no version_codename, parse it from the version + codename = re.search(r'(\(\D+\))|,(\s+)?\D+', props['version']) + if codename: + codename = codename.group() + codename = codename.strip('()') + codename = codename.strip(',') + codename = codename.strip() + # codename appears within paranthese. + props['codename'] = codename + + return props + + @cached_property + def _lsb_release_info(self): + """ + Get the information items from the lsb_release command output. + + Returns: + A dictionary containing all information items. + """ + if not self.include_lsb: + return {} + with open(os.devnull, 'w') as devnull: + try: + cmd = ('lsb_release', '-a') + stdout = subprocess.check_output(cmd, stderr=devnull) + except OSError: # Command not found + return {} + content = stdout.decode(sys.getfilesystemencoding()).splitlines() + return self._parse_lsb_release_content(content) + + @staticmethod + def _parse_lsb_release_content(lines): + """ + Parse the output of the lsb_release command. + + Parameters: + + * lines: Iterable through the lines of the lsb_release output. + Each line must be a unicode string or a UTF-8 encoded byte + string. + + Returns: + A dictionary containing all information items. + """ + props = {} + for line in lines: + kv = line.strip('\n').split(':', 1) + if len(kv) != 2: + # Ignore lines without colon. + continue + k, v = kv + props.update({k.replace(' ', '_').lower(): v.strip()}) + return props + + @cached_property + def _uname_info(self): + with open(os.devnull, 'w') as devnull: + try: + cmd = ('uname', '-rs') + stdout = subprocess.check_output(cmd, stderr=devnull) + except OSError: + return {} + content = stdout.decode(sys.getfilesystemencoding()).splitlines() + return self._parse_uname_content(content) + + @staticmethod + def _parse_uname_content(lines): + props = {} + match = re.search(r'^([^\s]+)\s+([\d\.]+)', lines[0].strip()) + if match: + name, version = match.groups() + + # This is to prevent the Linux kernel version from + # appearing as the 'best' version on otherwise + # identifiable distributions. + if name == 'Linux': + return {} + props['id'] = name.lower() + props['name'] = name + props['release'] = version + return props + + @cached_property + def _distro_release_info(self): + """ + Get the information items from the specified distro release file. + + Returns: + A dictionary containing all information items. + """ + if self.distro_release_file: + # If it was specified, we use it and parse what we can, even if + # its file name or content does not match the expected pattern. + distro_info = self._parse_distro_release_file( + self.distro_release_file) + basename = os.path.basename(self.distro_release_file) + # The file name pattern for user-specified distro release files + # is somewhat more tolerant (compared to when searching for the + # file), because we want to use what was specified as best as + # possible. + match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename) + if 'name' in distro_info \ + and 'cloudlinux' in distro_info['name'].lower(): + distro_info['id'] = 'cloudlinux' + elif match: + distro_info['id'] = match.group(1) + return distro_info + else: + try: + basenames = os.listdir(_UNIXCONFDIR) + # We sort for repeatability in cases where there are multiple + # distro specific files; e.g. CentOS, Oracle, Enterprise all + # containing `redhat-release` on top of their own. + basenames.sort() + except OSError: + # This may occur when /etc is not readable but we can't be + # sure about the *-release files. Check common entries of + # /etc for information. If they turn out to not be there the + # error is handled in `_parse_distro_release_file()`. + basenames = ['SuSE-release', + 'arch-release', + 'base-release', + 'centos-release', + 'fedora-release', + 'gentoo-release', + 'mageia-release', + 'mandrake-release', + 'mandriva-release', + 'mandrivalinux-release', + 'manjaro-release', + 'oracle-release', + 'redhat-release', + 'sl-release', + 'slackware-version'] + for basename in basenames: + if basename in _DISTRO_RELEASE_IGNORE_BASENAMES: + continue + match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename) + if match: + filepath = os.path.join(_UNIXCONFDIR, basename) + distro_info = self._parse_distro_release_file(filepath) + if 'name' in distro_info: + # The name is always present if the pattern matches + self.distro_release_file = filepath + distro_info['id'] = match.group(1) + if 'cloudlinux' in distro_info['name'].lower(): + distro_info['id'] = 'cloudlinux' + return distro_info + return {} + + def _parse_distro_release_file(self, filepath): + """ + Parse a distro release file. + + Parameters: + + * filepath: Path name of the distro release file. + + Returns: + A dictionary containing all information items. + """ + try: + with open(filepath) as fp: + # Only parse the first line. For instance, on SLES there + # are multiple lines. We don't want them... + return self._parse_distro_release_content(fp.readline()) + except (OSError, IOError): + # Ignore not being able to read a specific, seemingly version + # related file. + # See https://github.com/nir0s/distro/issues/162 + return {} + + @staticmethod + def _parse_distro_release_content(line): + """ + Parse a line from a distro release file. + + Parameters: + * line: Line from the distro release file. Must be a unicode string + or a UTF-8 encoded byte string. + + Returns: + A dictionary containing all information items. + """ + if isinstance(line, bytes): + line = line.decode('utf-8') + matches = _DISTRO_RELEASE_CONTENT_REVERSED_PATTERN.match( + line.strip()[::-1]) + distro_info = {} + if matches: + # regexp ensures non-None + distro_info['name'] = matches.group(3)[::-1] + if matches.group(2): + distro_info['version_id'] = matches.group(2)[::-1] + if matches.group(1): + distro_info['codename'] = matches.group(1)[::-1] + elif line: + distro_info['name'] = line.strip() + return distro_info + + +_distro = LinuxDistribution() + + +def main(): + logger = logging.getLogger(__name__) + logger.setLevel(logging.DEBUG) + logger.addHandler(logging.StreamHandler(sys.stdout)) + + parser = argparse.ArgumentParser(description="OS distro info tool") + parser.add_argument( + '--json', + '-j', + help="Output in machine readable format", + action="store_true") + args = parser.parse_args() + + if args.json: + logger.info(json.dumps(info(), indent=4, sort_keys=True)) + else: + logger.info('Name: %s', name(pretty=True)) + distribution_version = version(pretty=True) + logger.info('Version: %s', distribution_version) + distribution_codename = codename() + logger.info('Codename: %s', distribution_codename) + + +if __name__ == '__main__': + main() diff --git a/cres/venv/lib/python3.8/site-packages/easy_install.py b/cres/venv/lib/python3.8/site-packages/easy_install.py new file mode 100644 index 000000000..d87e98403 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/easy_install.py @@ -0,0 +1,5 @@ +"""Run the EasyInstall command""" + +if __name__ == '__main__': + from setuptools.command.easy_install import main + main() diff --git a/cres/venv/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/AUTHORS.txt b/cres/venv/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/AUTHORS.txt new file mode 100644 index 000000000..72c87d7d3 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/AUTHORS.txt @@ -0,0 +1,562 @@ +A_Rog +Aakanksha Agrawal <11389424+rasponic@users.noreply.github.com> +Abhinav Sagar <40603139+abhinavsagar@users.noreply.github.com> +ABHYUDAY PRATAP SINGH +abs51295 +AceGentile +Adam Chainz +Adam Tse +Adam Tse +Adam Wentz +admin +Adrien Morison +ahayrapetyan +Ahilya +AinsworthK +Akash Srivastava +Alan Yee +Albert Tugushev +Albert-Guan +albertg +Aleks Bunin +Alethea Flowers +Alex Gaynor +Alex Grönholm +Alex Loosley +Alex Morega +Alex Stachowiak +Alexander Shtyrov +Alexandre Conrad +Alexey Popravka +Alexey Popravka +Alli +Ami Fischman +Ananya Maiti +Anatoly Techtonik +Anders Kaseorg +Andreas Lutro +Andrei Geacar +Andrew Gaul +Andrey Bulgakov +Andrés Delfino <34587441+andresdelfino@users.noreply.github.com> +Andrés Delfino +Andy Freeland +Andy Freeland +Andy Kluger +Ani Hayrapetyan +Aniruddha Basak +Anish Tambe +Anrs Hu +Anthony Sottile +Antoine Musso +Anton Ovchinnikov +Anton Patrushev +Antonio Alvarado Hernandez +Antony Lee +Antti Kaihola +Anubhav Patel +Anuj Godase +AQNOUCH Mohammed +AraHaan +Arindam Choudhury +Armin Ronacher +Artem +Ashley Manton +Ashwin Ramaswami +atse +Atsushi Odagiri +Avner Cohen +Baptiste Mispelon +Barney Gale +barneygale +Bartek Ogryczak +Bastian Venthur +Ben Darnell +Ben Hoyt +Ben Rosser +Bence Nagy +Benjamin Peterson +Benjamin VanEvery +Benoit Pierre +Berker Peksag +Bernardo B. Marques +Bernhard M. Wiedemann +Bertil Hatt +Bogdan Opanchuk +BorisZZZ +Brad Erickson +Bradley Ayers +Brandon L. Reiss +Brandt Bucher +Brett Randall +Brian Cristante <33549821+brcrista@users.noreply.github.com> +Brian Cristante +Brian Rosner +BrownTruck +Bruno Oliveira +Bruno Renié +Bstrdsmkr +Buck Golemon +burrows +Bussonnier Matthias +c22 +Caleb Martinez +Calvin Smith +Carl Meyer +Carlos Liam +Carol Willing +Carter Thayer +Cass +Chandrasekhar Atina +Chih-Hsuan Yen +Chih-Hsuan Yen +Chris Brinker +Chris Hunt +Chris Jerdonek +Chris McDonough +Chris Wolfe +Christian Heimes +Christian Oudard +Christopher Hunt +Christopher Snyder +Clark Boylan +Clay McClure +Cody +Cody Soyland +Colin Watson +Connor Osborn +Cooper Lees +Cooper Ry Lees +Cory Benfield +Cory Wright +Craig Kerstiens +Cristian Sorinel +Curtis Doty +cytolentino +Damian Quiroga +Dan Black +Dan Savilonis +Dan Sully +daniel +Daniel Collins +Daniel Hahler +Daniel Holth +Daniel Jost +Daniel Shaulov +Daniele Esposti +Daniele Procida +Danny Hermes +Dav Clark +Dave Abrahams +Dave Jones +David Aguilar +David Black +David Bordeynik +David Bordeynik +David Caro +David Evans +David Linke +David Pursehouse +David Tucker +David Wales +Davidovich +derwolfe +Desetude +Diego Caraballo +DiegoCaraballo +Dmitry Gladkov +Domen Kožar +Donald Stufft +Dongweiming +Douglas Thor +DrFeathers +Dustin Ingram +Dwayne Bailey +Ed Morley <501702+edmorley@users.noreply.github.com> +Ed Morley +Eitan Adler +ekristina +elainechan +Eli Schwartz +Eli Schwartz +Emil Burzo +Emil Styrke +Endoh Takanao +enoch +Erdinc Mutlu +Eric Gillingham +Eric Hanchrow +Eric Hopper +Erik M. Bray +Erik Rose +Ernest W Durbin III +Ernest W. Durbin III +Erwin Janssen +Eugene Vereshchagin +everdimension +Felix Yan +fiber-space +Filip Kokosiński +Florian Briand +Florian Rathgeber +Francesco +Francesco Montesano +Frost Ming +Gabriel Curio +Gabriel de Perthuis +Garry Polley +gdanielson +Geoffrey Lehée +Geoffrey Sneddon +George Song +Georgi Valkov +Giftlin Rajaiah +gizmoguy1 +gkdoc <40815324+gkdoc@users.noreply.github.com> +Gopinath M <31352222+mgopi1990@users.noreply.github.com> +GOTO Hayato <3532528+gh640@users.noreply.github.com> +gpiks +Guilherme Espada +Guy Rozendorn +gzpan123 +Hanjun Kim +Hari Charan +Harsh Vardhan +Herbert Pfennig +Hsiaoming Yang +Hugo +Hugo Lopes Tavares +Hugo van Kemenade +hugovk +Hynek Schlawack +Ian Bicking +Ian Cordasco +Ian Lee +Ian Stapleton Cordasco +Ian Wienand +Ian Wienand +Igor Kuzmitshov +Igor Sobreira +Ilya Baryshev +INADA Naoki +Ionel Cristian Mărieș +Ionel Maries Cristian +Ivan Pozdeev +Jacob Kim +jakirkham +Jakub Stasiak +Jakub Vysoky +Jakub Wilk +James Cleveland +James Cleveland +James Firth +James Polley +Jan Pokorný +Jannis Leidel +jarondl +Jason R. Coombs +Jay Graves +Jean-Christophe Fillion-Robin +Jeff Barber +Jeff Dairiki +Jelmer Vernooij +jenix21 +Jeremy Stanley +Jeremy Zafran +Jiashuo Li +Jim Garrison +Jivan Amara +John Paton +John-Scott Atlakson +johnthagen +johnthagen +Jon Banafato +Jon Dufresne +Jon Parise +Jonas Nockert +Jonathan Herbert +Joost Molenaar +Jorge Niedbalski +Joseph Long +Josh Bronson +Josh Hansen +Josh Schneier +Juanjo Bazán +Julian Berman +Julian Gethmann +Julien Demoor +jwg4 +Jyrki Pulliainen +Kai Chen +Kamal Bin Mustafa +kaustav haldar +keanemind +Keith Maxwell +Kelsey Hightower +Kenneth Belitzky +Kenneth Reitz +Kenneth Reitz +Kevin Burke +Kevin Carter +Kevin Frommelt +Kevin R Patterson +Kexuan Sun +Kit Randel +kpinc +Krishna Oza +Kumar McMillan +Kyle Persohn +lakshmanaram +Laszlo Kiss-Kollar +Laurent Bristiel +Laurie Opperman +Leon Sasson +Lev Givon +Lincoln de Sousa +Lipis +Loren Carvalho +Lucas Cimon +Ludovic Gasc +Luke Macken +Luo Jiebin +luojiebin +luz.paz +László Kiss Kollár +László Kiss Kollár +Marc Abramowitz +Marc Tamlyn +Marcus Smith +Mariatta +Mark Kohler +Mark Williams +Mark Williams +Markus Hametner +Masaki +Masklinn +Matej Stuchlik +Mathew Jennings +Mathieu Bridon +Matt Good +Matt Maker +Matt Robenolt +matthew +Matthew Einhorn +Matthew Gilliard +Matthew Iversen +Matthew Trumbell +Matthew Willson +Matthias Bussonnier +mattip +Maxim Kurnikov +Maxime Rouyrre +mayeut +mbaluna <44498973+mbaluna@users.noreply.github.com> +mdebi <17590103+mdebi@users.noreply.github.com> +memoselyk +Michael +Michael Aquilina +Michael E. Karpeles +Michael Klich +Michael Williamson +michaelpacer +Mickaël Schoentgen +Miguel Araujo Perez +Mihir Singh +Mike +Mike Hendricks +Min RK +MinRK +Miro Hrončok +Monica Baluna +montefra +Monty Taylor +Nate Coraor +Nathaniel J. Smith +Nehal J Wani +Neil Botelho +Nick Coghlan +Nick Stenning +Nick Timkovich +Nicolas Bock +Nikhil Benesch +Nitesh Sharma +Nowell Strite +NtaleGrey +nvdv +Ofekmeister +ofrinevo +Oliver Jeeves +Oliver Tonnhofer +Olivier Girardot +Olivier Grisel +Ollie Rutherfurd +OMOTO Kenji +Omry Yadan +Oren Held +Oscar Benjamin +Oz N Tiram +Pachwenko <32424503+Pachwenko@users.noreply.github.com> +Patrick Dubroy +Patrick Jenkins +Patrick Lawson +patricktokeeffe +Patrik Kopkan +Paul Kehrer +Paul Moore +Paul Nasrat +Paul Oswald +Paul van der Linden +Paulus Schoutsen +Pavithra Eswaramoorthy <33131404+QueenCoffee@users.noreply.github.com> +Pawel Jasinski +Pekka Klärck +Peter Lisák +Peter Waller +petr-tik +Phaneendra Chiruvella +Phil Freo +Phil Pennock +Phil Whelan +Philip Jägenstedt +Philip Molloy +Philippe Ombredanne +Pi Delport +Pierre-Yves Rofes +pip +Prabakaran Kumaresshan +Prabhjyotsing Surjit Singh Sodhi +Prabhu Marappan +Pradyun Gedam +Pratik Mallya +Preet Thakkar +Preston Holmes +Przemek Wrzos +Pulkit Goyal <7895pulkit@gmail.com> +Qiangning Hong +Quentin Pradet +R. David Murray +Rafael Caricio +Ralf Schmitt +Razzi Abuissa +rdb +Remi Rampin +Remi Rampin +Rene Dudfield +Riccardo Magliocchetti +Richard Jones +RobberPhex +Robert Collins +Robert McGibbon +Robert T. McGibbon +robin elisha robinson +Roey Berman +Rohan Jain +Rohan Jain +Rohan Jain +Roman Bogorodskiy +Romuald Brunet +Ronny Pfannschmidt +Rory McCann +Ross Brattain +Roy Wellington Ⅳ +Roy Wellington Ⅳ +Ryan Wooden +ryneeverett +Sachi King +Salvatore Rinchiera +Savio Jomton +schlamar +Scott Kitterman +Sean +seanj +Sebastian Jordan +Sebastian Schaetz +Segev Finer +SeongSoo Cho +Sergey Vasilyev +Seth Woodworth +Shlomi Fish +Shovan Maity +Simeon Visser +Simon Cross +Simon Pichugin +sinoroc +Sorin Sbarnea +Stavros Korokithakis +Stefan Scherfke +Stephan Erb +stepshal +Steve (Gadget) Barnes +Steve Barnes +Steve Dower +Steve Kowalik +Steven Myint +stonebig +Stéphane Bidoul (ACSONE) +Stéphane Bidoul +Stéphane Klein +Sumana Harihareswara +Sviatoslav Sydorenko +Sviatoslav Sydorenko +Swat009 +Takayuki SHIMIZUKAWA +tbeswick +Thijs Triemstra +Thomas Fenzl +Thomas Grainger +Thomas Guettler +Thomas Johansson +Thomas Kluyver +Thomas Smith +Tim D. Smith +Tim Gates +Tim Harder +Tim Heap +tim smith +tinruufu +Tom Forbes +Tom Freudenheim +Tom V +Tomas Orsava +Tomer Chachamu +Tony Beswick +Tony Zhaocheng Tan +TonyBeswick +toonarmycaptain +Toshio Kuratomi +Travis Swicegood +Tzu-ping Chung +Valentin Haenel +Victor Stinner +victorvpaulo +Viktor Szépe +Ville Skyttä +Vinay Sajip +Vincent Philippon +Vinicyus Macedo <7549205+vinicyusmacedo@users.noreply.github.com> +Vitaly Babiy +Vladimir Rutsky +W. Trevor King +Wil Tan +Wilfred Hughes +William ML Leslie +William T Olson +Wilson Mo +wim glenn +Wolfgang Maier +Xavier Fernandez +Xavier Fernandez +xoviat +xtreak +YAMAMOTO Takashi +Yen Chi Hsuan +Yeray Diaz Diaz +Yoval P +Yu Jian +Yuan Jing Vincent Yan +Zearin +Zearin +Zhiping Deng +Zvezdan Petkovic +Łukasz Langa +Семён Марьясин diff --git a/cres/venv/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/INSTALLER b/cres/venv/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/INSTALLER new file mode 100644 index 000000000..a1b589e38 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/cres/venv/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/LICENSE.txt b/cres/venv/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/LICENSE.txt new file mode 100644 index 000000000..737fec5c5 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/LICENSE.txt @@ -0,0 +1,20 @@ +Copyright (c) 2008-2019 The pip developers (see AUTHORS.txt file) + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/cres/venv/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/METADATA b/cres/venv/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/METADATA new file mode 100644 index 000000000..a9b0bba23 --- /dev/null +++ b/cres/venv/lib/python3.8/site-packages/html5lib-1.0.1.dist-info/METADATA @@ -0,0 +1,526 @@ +Metadata-Version: 2.1 +Name: html5lib +Version: 1.0.1 +Summary: HTML parser based on the WHATWG HTML specification +Home-page: https://github.com/html5lib/html5lib-python +Maintainer: James Graham +Maintainer-email: james@hoppipolla.co.uk +License: MIT License +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +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.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Markup :: HTML +Provides-Extra: all +Requires-Dist: chardet (>=2.2) ; extra == 'all' +Requires-Dist: genshi ; extra == 'all' +Requires-Dist: datrie ; (platform_python_implementation == 'CPython') and extra == 'all' +Requires-Dist: lxml ; (platform_python_implementation == 'CPython') and extra == 'all' +Provides-Extra: chardet +Requires-Dist: chardet (>=2.2) ; extra == 'chardet' +Provides-Extra: datrie +Requires-Dist: datrie ; (platform_python_implementation == 'CPython') and extra == 'datrie' +Provides-Extra: genshi +Requires-Dist: genshi ; extra == 'genshi' +Provides-Extra: lxml +Requires-Dist: lxml ; (platform_python_implementation == 'CPython') and extra == 'lxml' + +html5lib +======== + +.. image:: https://travis-ci.org/html5lib/html5lib-python.png?branch=master + :target: https://travis-ci.org/html5lib/html5lib-python + +html5lib is a pure-python library for parsing HTML. It is designed to +conform to the WHATWG HTML specification, as is implemented by all major +web browsers. + + +Usage +----- + +Simple usage follows this pattern: + +.. code-block:: python + + import html5lib + with open("mydocument.html", "rb") as f: + document = html5lib.parse(f) + +or: + +.. code-block:: python + + import html5lib + document = html5lib.parse("

Hello World!") + +By default, the ``document`` will be an ``xml.etree`` element instance. +Whenever possible, html5lib chooses the accelerated ``ElementTree`` +implementation (i.e. ``xml.etree.cElementTree`` on Python 2.x). + +Two other tree types are supported: ``xml.dom.minidom`` and +``lxml.etree``. To use an alternative format, specify the name of +a treebuilder: + +.. code-block:: python + + import html5lib + with open("mydocument.html", "rb") as f: + lxml_etree_document = html5lib.parse(f, treebuilder="lxml") + +When using with ``urllib2`` (Python 2), the charset from HTTP should be +pass into html5lib as follows: + +.. code-block:: python + + from contextlib import closing + from urllib2 import urlopen + import html5lib + + with closing(urlopen("http://example.com/")) as f: + document = html5lib.parse(f, transport_encoding=f.info().getparam("charset")) + +When using with ``urllib.request`` (Python 3), the charset from HTTP +should be pass into html5lib as follows: + +.. code-block:: python + + from urllib.request import urlopen + import html5lib + + with urlopen("http://example.com/") as f: + document = html5lib.parse(f, transport_encoding=f.info().get_content_charset()) + +To have more control over the parser, create a parser object explicitly. +For instance, to make the parser raise exceptions on parse errors, use: + +.. code-block:: python + + import html5lib + with open("mydocument.html", "rb") as f: + parser = html5lib.HTMLParser(strict=True) + document = parser.parse(f) + +When you're instantiating parser objects explicitly, pass a treebuilder +class as the ``tree`` keyword argument to use an alternative document +format: + +.. code-block:: python + + import html5lib + parser = html5lib.HTMLParser(tree=html5lib.getTreeBuilder("dom")) + minidom_document = parser.parse("

Hello World!") + +More documentation is available at https://html5lib.readthedocs.io/. + + +Installation +------------ + +html5lib works on CPython 2.7+, CPython 3.3+ and PyPy. To install it, +use: + +.. code-block:: bash + + $ pip install html5lib + + +Optional Dependencies +--------------------- + +The following third-party libraries may be used for additional +functionality: + +- ``datrie`` can be used under CPython to improve parsing performance + (though in almost all cases the improvement is marginal); + +- ``lxml`` is supported as a tree format (for both building and + walking) under CPython (but *not* PyPy where it is known to cause + segfaults); + +- ``genshi`` has a treewalker (but not builder); and + +- ``chardet`` can be used as a fallback when character encoding cannot + be determined. + + +Bugs +---- + +Please report any bugs on the `issue tracker +`_. + + +Tests +----- + +Unit tests require the ``pytest`` and ``mock`` libraries and can be +run using the ``py.test`` command in the root directory. + +Test data are contained in a separate `html5lib-tests +`_ repository and included +as a submodule, thus for git checkouts they must be initialized:: + + $ git submodule init + $ git submodule update + +If you have all compatible Python implementations available on your +system, you can run tests on all of them using the ``tox`` utility, +which can be found on PyPI. + + +Questions? +---------- + +There's a mailing list available for support on Google Groups, +`html5lib-discuss `_, +though you may get a quicker response asking on IRC in `#whatwg on +irc.freenode.net `_. + +Change Log +---------- + +1.0.1 +~~~~~ + +Released on December 7, 2017 + +Breaking changes: + +* Drop support for Python 2.6. (#330) (Thank you, Hugo, Will Kahn-Greene!) +* Remove ``utils/spider.py`` (#353) (Thank you, Jon Dufresne!) + +Features: + +* Improve documentation. (#300, #307) (Thank you, Jon Dufresne, Tom Most, + Will Kahn-Greene!) +* Add iframe seamless boolean attribute. (Thank you, Ritwik Gupta!) +* Add itemscope as a boolean attribute. (#194) (Thank you, Jonathan Vanasco!) +* Support Python 3.6. (#333) (Thank you, Jon Dufresne!) +* Add CI support for Windows using AppVeyor. (Thank you, John Vandenberg!) +* Improve testing and CI and add code coverage (#323, #334), (Thank you, Jon + Dufresne, John Vandenberg, Geoffrey Sneddon, Will Kahn-Greene!) +* Semver-compliant version number. + +Bug fixes: + +* Add support for setuptools < 18.5 to support environment markers. (Thank you, + John Vandenberg!) +* Add explicit dependency for six >= 1.9. (Thank you, Eric Amorde!) +* Fix regexes to work with Python 3.7 regex adjustments. (#318, #379) (Thank + you, Benedikt Morbach, Ville Skyttä, Mark Vasilkov!) +* Fix alphabeticalattributes filter namespace bug. (#324) (Thank you, Will + Kahn-Greene!) +* Include license file in generated wheel package. (#350) (Thank you, Jon + Dufresne!) +* Fix annotation-xml typo. (#339) (Thank you, Will Kahn-Greene!) +* Allow uppercase hex chararcters in CSS colour check. (#377) (Thank you, + Komal Dembla, Hugo!) + + +1.0 +~~~ + +Released and unreleased on December 7, 2017. Badly packaged release. + + +0.999999999/1.0b10 +~~~~~~~~~~~~~~~~~~ + +Released on July 15, 2016 + +* Fix attribute order going to the tree builder to be document order + instead of reverse document order(!). + + +0.99999999/1.0b9 +~~~~~~~~~~~~~~~~ + +Released on July 14, 2016 + +* **Added ordereddict as a mandatory dependency on Python 2.6.** + +* Added ``lxml``, ``genshi``, ``datrie``, ``charade``, and ``all`` + extras that will do the right thing based on the specific + interpreter implementation. + +* Now requires the ``mock`` package for the testsuite. + +* Cease supporting DATrie under PyPy. + +* **Remove PullDOM support, as this hasn't ever been properly + tested, doesn't entirely work, and as far as I can tell is + completely unused by anyone.** + +* Move testsuite to ``py.test``. + +* **Fix #124: move to webencodings for decoding the input byte stream; + this makes html5lib compliant with the Encoding Standard, and + introduces a required dependency on webencodings.** + +* **Cease supporting Python 3.2 (in both CPython and PyPy forms).** + +* **Fix comments containing double-dash with lxml 3.5 and above.** + +* **Use scripting disabled by default (as we don't implement + scripting).** + +* **Fix #11, avoiding the XSS bug potentially caused by serializer + allowing attribute values to be escaped out of in old browser versions, + changing the quote_attr_values option on serializer to take one of + three values, "always" (the old True value), "legacy" (the new option, + and the new default), and "spec" (the old False value, and the old + default).** + +* **Fix #72 by rewriting the sanitizer to apply only to treewalkers + (instead of the tokenizer); as such, this will require amending all + callers of it to use it via the treewalker API.** + +* **Drop support of charade, now that chardet is supported once more.** + +* **Replace the charset keyword argument on parse and related methods + with a set of keyword arguments: override_encoding, transport_encoding, + same_origin_parent_encoding, likely_encoding, and default_encoding.** + +* **Move filters._base, treebuilder._base, and treewalkers._base to .base + to clarify their status as public.** + +* **Get rid of the sanitizer package. Merge sanitizer.sanitize into the + sanitizer.htmlsanitizer module and move that to sanitizer. This means + anyone who used sanitizer.sanitize or sanitizer.HTMLSanitizer needs no + code changes.** + +* **Rename treewalkers.lxmletree to .etree_lxml and + treewalkers.genshistream to .genshi to have a consistent API.** + +* Move a whole load of stuff (inputstream, ihatexml, trie, tokenizer, + utils) to be underscore prefixed to clarify their status as private. + + +0.9999999/1.0b8 +~~~~~~~~~~~~~~~ + +Released on September 10, 2015 + +* Fix #195: fix the sanitizer to drop broken URLs (it threw an + exception between 0.9999 and 0.999999). + + +0.999999/1.0b7 +~~~~~~~~~~~~~~ + +Released on July 7, 2015 + +* Fix #189: fix the sanitizer to allow relative URLs again (as it did + prior to 0.9999/1.0b5). + + +0.99999/1.0b6 +~~~~~~~~~~~~~ + +Released on April 30, 2015 + +* Fix #188: fix the sanitizer to not throw an exception when sanitizing + bogus data URLs. + + +0.9999/1.0b5 +~~~~~~~~~~~~ + +Released on April 29, 2015 + +* Fix #153: Sanitizer fails to treat some attributes as URLs. Despite how + this sounds, this has no known security implications. No known version + of IE (5.5 to current), Firefox (3 to current), Safari (6 to current), + Chrome (1 to current), or Opera (12 to current) will run any script + provided in these attributes. + +* Pass error message to the ParseError exception in strict parsing mode. + +* Allow data URIs in the sanitizer, with a whitelist of content-types. + +* Add support for Python implementations that don't support lone + surrogates (read: Jython). Fixes #2. + +* Remove localization of error messages. This functionality was totally + unused (and untested that everything was localizable), so we may as + well follow numerous browsers in not supporting translating technical + strings. + +* Expose treewalkers.pprint as a public API. + +* Add a documentEncoding property to HTML5Parser, fix #121. + + +0.999 +~~~~~ + +Released on December 23, 2013 + +* Fix #127: add work-around for CPython issue #20007: .read(0) on + http.client.HTTPResponse drops the rest of the content. + +* Fix #115: lxml treewalker can now deal with fragments containing, at + their root level, text nodes with non-ASCII characters on Python 2. + + +0.99 +~~~~ + +Released on September 10, 2013 + +* No library changes from 1.0b3; released as 0.99 as pip has changed + behaviour from 1.4 to avoid installing pre-release versions per + PEP 440. + + +1.0b3 +~~~~~ + +Released on July 24, 2013 + +* Removed ``RecursiveTreeWalker`` from ``treewalkers._base``. Any + implementation using it should be moved to + ``NonRecursiveTreeWalker``, as everything bundled with html5lib has + for years. + +* Fix #67 so that ``BufferedStream`` to correctly returns a bytes + object, thereby fixing any case where html5lib is passed a + non-seekable RawIOBase-like object. + + +1.0b2 +~~~~~ + +Released on June 27, 2013 + +* Removed reordering of attributes within the serializer. There is now + an ``alphabetical_attributes`` option which preserves the previous + behaviour through a new filter. This allows attribute order to be + preserved through html5lib if the tree builder preserves order. + +* Removed ``dom2sax`` from DOM treebuilders. It has been replaced by + ``treeadapters.sax.to_sax`` which is generic and supports any + treewalker; it also resolves all known bugs with ``dom2sax``. + +* Fix treewalker assertions on hitting bytes strings on + Python 2. Previous to 1.0b1, treewalkers coped with mixed + bytes/unicode data on Python 2; this reintroduces this prior + behaviour on Python 2. Behaviour is unchanged on Python 3. + + +1.0b1 +~~~~~ + +Released on May 17, 2013 + +* Implementation updated to implement the `HTML specification + `_ as of 5th May + 2013 (`SVN `_ revision r7867). + +* Python 3.2+ supported in a single codebase using the ``six`` library. + +* Removed support for Python 2.5 and older. + +* Removed the deprecated Beautiful Soup 3 treebuilder. + ``beautifulsoup4`` can use ``html5lib`` as a parser instead. Note that + since it doesn't support namespaces, foreign content like SVG and + MathML is parsed incorrectly. + +* Removed ``simpletree`` from the package. The default tree builder is + now ``etree`` (using the ``xml.etree.cElementTree`` implementation if + available, and ``xml.etree.ElementTree`` otherwise). + +* Removed the ``XHTMLSerializer`` as it never actually guaranteed its + output was well-formed XML, and hence provided little of use. + +* Removed default DOM treebuilder, so ``html5lib.treebuilders.dom`` is no + longer supported. ``html5lib.treebuilders.getTreeBuilder("dom")`` will + return the default DOM treebuilder, which uses ``xml.dom.minidom``. + +* Optional heuristic character encoding detection now based on + ``charade`` for Python 2.6 - 3.3 compatibility. + +* Optional ``Genshi`` treewalker support fixed. + +* Many bugfixes, including: + + * #33: null in attribute value breaks XML AttValue; + + * #4: nested, indirect descendant, + + + + + + + +

+
+ +

+                        
+ + +
+
+ +
+ + +
+
+ Your contents... +
+
+
+ +
+
+ + +
+
+
+ +{% endblock content %} + + +{% block javascripts %}{% endblock javascripts %} diff --git a/scripts/cre_sync/templates/layouts/base-fullscreen.html b/scripts/cre_sync/templates/layouts/base-fullscreen.html new file mode 100644 index 000000000..a472ef8c4 --- /dev/null +++ b/scripts/cre_sync/templates/layouts/base-fullscreen.html @@ -0,0 +1,57 @@ + + + + + + + + + Jinja Template Pixel Lite - {% block title %}{% endblock %} | AppSeed + + + + + + + + + + +{% block stylesheets %}{% endblock stylesheets %} + + + + + +
+ + {% include 'includes/preloader.html' %} + + {% block content %}{% endblock content %} + +
+ + {% include 'includes/scripts.html' %} + + + {% block javascripts %}{% endblock javascripts %} + + + + diff --git a/scripts/cre_sync/templates/page-404.html b/scripts/cre_sync/templates/page-404.html new file mode 100644 index 000000000..a3685602a --- /dev/null +++ b/scripts/cre_sync/templates/page-404.html @@ -0,0 +1,38 @@ +{% extends "layouts/base-fullscreen.html" %} + +{% block title %} Error 404 {% endblock %} + + +{% block stylesheets %}{% endblock stylesheets %} + +{% block content %} + + +
+
+
+
+ +
+
+
+
+ +{% endblock content %} + + +{% block javascripts %}{% endblock javascripts %} diff --git a/scripts/cre_sync/templates/page-500.html b/scripts/cre_sync/templates/page-500.html new file mode 100644 index 000000000..e854da2e9 --- /dev/null +++ b/scripts/cre_sync/templates/page-500.html @@ -0,0 +1,38 @@ +{% extends "layouts/base-fullscreen.html" %} + +{% block title %} Error 500 {% endblock %} + + +{% block stylesheets %}{% endblock stylesheets %} + +{% block content %} + + +
+
+
+
+ +
+
+
+
+ +{% endblock content %} + + +{% block javascripts %}{% endblock javascripts %} diff --git a/scripts/cre_sync/templates/page-blank.html b/scripts/cre_sync/templates/page-blank.html new file mode 100644 index 000000000..399f9b080 --- /dev/null +++ b/scripts/cre_sync/templates/page-blank.html @@ -0,0 +1,15 @@ +{% extends "layouts/base.html" %} + +{% block title %} Blank {% endblock %} + + +{% block stylesheets %}{% endblock stylesheets %} + +{% block content %} + + + +{% endblock content %} + + +{% block javascripts %}{% endblock javascripts %} diff --git a/scripts/cre_sync/visualise.py b/scripts/cre_sync/visualise.py new file mode 100644 index 000000000..acba56b08 --- /dev/null +++ b/scripts/cre_sync/visualise.py @@ -0,0 +1,29 @@ +from mapping_add import * +from pprint import pprint +import json + +def export_json(): + """ exports graph to json object, can be used for javascript visualisation""" + graph = {"nodes":{"cres":[],"standards":[]},"edges":[]} + + collection = Standard_collection(cache=True, cache_file="standards_cache.sqlite") + cres = collection.session.query(CRE).all() + for cre in cres: + graph["nodes"]["cres"].append((dict((name, getattr(cre, name)) for name in dir(cre) if not name.startswith('_') and not name=='metadata'))) + + standards = collection.session.query(Standard).all() + for standard in standards: + graph["nodes"]["standards"].append((dict((name, getattr(standard, name)) for name in dir(standard) if not name.startswith('_') and not name=='metadata'))) + + + links = collection.session.query(Links).all() + for link in links: + graph["edges"].append((dict((name, getattr(link, name)) for name in dir(link) if not name.startswith('_') and not name=='metadata'))) + + # print(json.dumps(nodes)) + # print(json.dumps(edges)) + with open("cre_graph.json",'w+') as cg: + cg.write("const graph=") + json.dump(graph,cg) +if __name__ == "__main__": + export_json() diff --git a/scripts/cre_sync/web_main.py b/scripts/cre_sync/web_main.py new file mode 100644 index 000000000..5dc568a60 --- /dev/null +++ b/scripts/cre_sync/web_main.py @@ -0,0 +1,55 @@ +import json +import db +from flask import Flask, jsonify, render_template,request +from jinja2 import Template +from pprint import pprint +from jinja2 import TemplateNotFound + +app = Flask(__name__) + +cache_loc = 'standards_cache.sqlite' +database = db.Standard_collection(cache=True, cache_file=cache_loc) + +@app.route('/', methods=["GET"]) +def index(): + return render_template("index.html") + + +@app.route('/rest/v1/id/', methods=["GET"]) +def find_by_id(creid): # refer + cre = database.get_CRE(id=creid) + if cre: + pprint(cre.todict()) + return jsonify(cre.todict()) + +@app.route('/rest/v1/name/', methods=["GET"]) +def find_by_name(crename): + cre = database.get_CRE(name=crename) + if cre: + pprint(cre.todict()) + return jsonify(cre.todict()) + +@app.route('/rest/v1/standard/', methods=["GET"]) +def find_standard_by_name(sname): + opt_section = request.args.get('section') + opt_subsection = request.args.get('subsection') + opt_hyperlink = request.args.get('hyperlink') + + standards = database.get_standards(name=sname,section=opt_section,subsection=opt_subsection, link = opt_hyperlink) + if standards: + res = [stand.todict() for stand in standards] + return jsonify(res) + + +@app.route('/rest/v1/tags', methods=["GET"]) +def find_document_by_tag(sname): + tags = request.args.getlist('tag') + documents = database.get_by_tags(tags) + if documents: + res = [doc.todict() for doc in documents] + return jsonify(res) + + +if __name__ == '__main__': + app.run(use_reloader=False, debug=False) + \ No newline at end of file From 407cc3016c489b7bec4a0c113697e2a254a47fd6 Mon Sep 17 00:00:00 2001 From: northdpole Date: Sat, 28 Aug 2021 13:41:26 +0100 Subject: [PATCH 10/11] remove owasp wiki files (prep for moving cre_sync to root) --- 404.html | 15 -- Gemfile | 4 - _config.yml | 4 - assets/images/README.md | 5 - assets/images/cc_license_small.png | Bin 9293 -> 0 bytes assets/images/owasp_breakers_small.png | Bin 1425 -> 0 bytes assets/images/owasp_builders_small.png | Bin 1468 -> 0 bytes assets/images/owasp_defenders_small.png | Bin 1554 -> 0 bytes assets/images/owasp_documentation_project.jpg | Bin 8821 -> 0 bytes index.md | 29 --- info-guide.yaml | 31 --- info.md | 18 -- info.yaml | 15 -- leaders.md | 5 - writeups/owasp_in_sdlc/images/OWASP-in0.png | Bin 49065 -> 0 bytes .../images/SDLC_in_OWASP_links.html | 11 - writeups/owasp_in_sdlc/images/defectdojo.png | Bin 359906 -> 0 bytes writeups/owasp_in_sdlc/images/impl_samm.png | Bin 48925 -> 0 bytes writeups/owasp_in_sdlc/images/juiceshop.png | Bin 63104 -> 0 bytes writeups/owasp_in_sdlc/images/rtf.png | Bin 233498 -> 0 bytes .../owasp_in_sdlc/images/samm_release.png | Bin 46503 -> 0 bytes .../owasp_in_sdlc/images/samm_testing.png | Bin 48288 -> 0 bytes writeups/owasp_in_sdlc/images/sdlc_diag.png | Bin 29200 -> 0 bytes writeups/owasp_in_sdlc/images/skf_code.png | Bin 112786 -> 0 bytes writeups/owasp_in_sdlc/images/skf_qs.png | Bin 63477 -> 0 bytes writeups/owasp_in_sdlc/images/summary.png | Bin 78321 -> 0 bytes .../owasp_in_sdlc/images/threat_model.png | Bin 49098 -> 0 bytes writeups/owasp_in_sdlc/index.md | 225 ------------------ 28 files changed, 362 deletions(-) delete mode 100644 404.html delete mode 100644 Gemfile delete mode 100644 _config.yml delete mode 100644 assets/images/README.md delete mode 100644 assets/images/cc_license_small.png delete mode 100644 assets/images/owasp_breakers_small.png delete mode 100644 assets/images/owasp_builders_small.png delete mode 100644 assets/images/owasp_defenders_small.png delete mode 100644 assets/images/owasp_documentation_project.jpg delete mode 100644 index.md delete mode 100644 info-guide.yaml delete mode 100644 info.md delete mode 100644 info.yaml delete mode 100644 leaders.md delete mode 100644 writeups/owasp_in_sdlc/images/OWASP-in0.png delete mode 100644 writeups/owasp_in_sdlc/images/SDLC_in_OWASP_links.html delete mode 100644 writeups/owasp_in_sdlc/images/defectdojo.png delete mode 100644 writeups/owasp_in_sdlc/images/impl_samm.png delete mode 100644 writeups/owasp_in_sdlc/images/juiceshop.png delete mode 100644 writeups/owasp_in_sdlc/images/rtf.png delete mode 100644 writeups/owasp_in_sdlc/images/samm_release.png delete mode 100644 writeups/owasp_in_sdlc/images/samm_testing.png delete mode 100644 writeups/owasp_in_sdlc/images/sdlc_diag.png delete mode 100644 writeups/owasp_in_sdlc/images/skf_code.png delete mode 100644 writeups/owasp_in_sdlc/images/skf_qs.png delete mode 100644 writeups/owasp_in_sdlc/images/summary.png delete mode 100644 writeups/owasp_in_sdlc/images/threat_model.png delete mode 100644 writeups/owasp_in_sdlc/index.md diff --git a/404.html b/404.html deleted file mode 100644 index cb4606758..000000000 --- a/404.html +++ /dev/null @@ -1,15 +0,0 @@ ---- - -title: 404 - Not Found -layout: col-generic - ---- - -
-

-

WHOA THAT PAGE CANNOT BE FOUND

-

Try the SEARCH function in the main navigation to find something. If you are looking for chapter information, please see Chapters for the correct chapter. For information about OWASP projects see Projects. For common attacks, vulnerabilities, or information about other community-led contributions see Contributed Content.

- -
-

If all else fails you can search our historical site.

-
diff --git a/Gemfile b/Gemfile deleted file mode 100644 index 89dbd970b..000000000 --- a/Gemfile +++ /dev/null @@ -1,4 +0,0 @@ -source 'https://rubygems.org' -group :jekyll_plugins do - gem "github-pages" -end \ No newline at end of file diff --git a/_config.yml b/_config.yml deleted file mode 100644 index d32525789..000000000 --- a/_config.yml +++ /dev/null @@ -1,4 +0,0 @@ -remote_theme: "owasp/www--site-theme" -plugins: - - jekyll-include-cache-0.2.0 - - jekyll-redirect-from diff --git a/assets/images/README.md b/assets/images/README.md deleted file mode 100644 index 3fc6dbe4a..000000000 --- a/assets/images/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# placeholder - -Put images you wish to link to in this folder - -link would be in form /assets/images/ diff --git a/assets/images/cc_license_small.png b/assets/images/cc_license_small.png deleted file mode 100644 index d532c136d50028825f31e3ca7bba32ca76ba37d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9293 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 diff --git a/assets/images/owasp_breakers_small.png b/assets/images/owasp_breakers_small.png deleted file mode 100644 index c8fa5b04a4edf35de6e48d79486f239fed628711..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1425 zcmV;C1#bF@P)WFU8GbZ8()Nlj27Z*CxAAWdOomE>Pr000E+Nkl1u22A7)(2*^dWUa=A=Rz#^%jThpDTCHNSR%=?Ty(O)tP5Z;PKbka+ z+Qc-ijcskB1`8^Jh}B@N6-A^PL>HDj>w*d@?1C)Ib!Ym6%~n)aB!Q@z=hw`cne)B# z&N<(?45+B6sHmts!3Y3xadGoRL5LL)1l5whp`a+TqGV=dWc(!oh=TC4zq`k>$iSdB zRAc+ZrJC!STC=$ou$hV=gb(-ce0TEH5I|HddVJcgon^Pp6#{^CUn&q)Q~R1n|L@_d zf&GALs%q-ff%G^x&)@UwL(9EfT$vmY$oo;zc)Gaun^?Wc$Z35AnH8lZ#jk!gOx?d? z6>l8+1At?1zKxl>o>6*(o>$j?(ggFVLu+^4zLlDcY->Rg0YPLL^jK}@X+?$X&b!FA*u^-BBAZVf1>mdM z^8nbFpGSI$j;*na=#*tX$Vg?!g|j3DKbS+06c^&>?#|ZO#RLr*YA<&b!;!Xa*;#Ck zj$!0bPg07s94XQbtf|M>yn|Jiscvjw*QE=j=(PB_xv?TNoS);CvGM3(oA5w>U$(NF z5dfcM9>YlxaCdg5-qLKpey&Q-x`-)^_VT7vmH{wYEDyy0`tMB6R~z_c$?|T7J}QPI zZ4E6JwwyXagnuBBLBXW1T05}aUlK(mQDodOAHIm0L&CvClC=4(2n{EAsArGQ-7=f) z1Dzy_i1%$Z>{_y%=Js}u6cu7R2>kA^K91TZlq zWX>2b@6f2g5yNa7D-Y$hq`fHiyrm=Y>Sg{cEe0SyG@LaNQxF7!mC1?re0ZX)gxAAf zu-6gl=TCcQCzoq)a#&Y@silPtk<)OIoB=R2n5b$nk!8^1=kCG$u@lhVs==x#e0TOV zZB{D)DTP|rM@EsXy+Tt*JI6~)NC=B~WDG~z>MYHitSl$-N*<;4cldP1EWBOadS&Fr zn>Xq!O~%6F(vs5xz|vQid^2y%*!T}4r;k^cu6<+YrQFh!mE{N0j;4R98mMllsHUo> zs;H(u`TMCdijr4z(`83)c7^&kwQm&MsdbU*S`kUM)lsIgwWT$y%AgwBM{NK7vs5Qk fR8&+{o_PKPEY~yLWNEq000000NkvXXu0mjf*$=$u diff --git a/assets/images/owasp_builders_small.png b/assets/images/owasp_builders_small.png deleted file mode 100644 index 01b07acf3af2d2f0381573b9241aa09534d4f198..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1468 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" - repository: "" - - : - - one of the OWASP project states e.g. - - incubator - - lab - - flagship - tags: - - any ammount of tags that seem necessary preferrably at least one of the following - - builders - - breakers - - defenders - - meta - sdlc: - - one or more of the following or empty - - Planning - - Analysis - - Design - - Implementation - - Maintenance - - Strategy - - Culture - example_usage: either link to demo site or a one liner to run the project with - output_type: - - vulnerabilities - - urls - - controls - - guidelines diff --git a/info.md b/info.md deleted file mode 100644 index 91b9b6675..000000000 --- a/info.md +++ /dev/null @@ -1,18 +0,0 @@ -### Integration Standards Information - -* Incubator Project -* Documentation -* Builder -* Defender -* Breaker - -### Slack - -* [Join OWASP Slack](https://owasp-slack.herokuapp.com/) -* [Join our channel](https://owasp.slack.com/archives/CPMEWT342) - -### Licensing - -The OWASP Integration Standards project is free to use under the [Creative Commons ShareAlike 4.0 License](https://creativecommons.org/licenses/by-sa/4.0/legalcode). - -![CC License](assets/images/cc_license_small.png) \ No newline at end of file diff --git a/info.yaml b/info.yaml deleted file mode 100644 index 21021d384..000000000 --- a/info.yaml +++ /dev/null @@ -1,15 +0,0 @@ ---- -info: - name: "Integration Standards" - repository: "https://github.com/OWASP/www-project-integration-standards/" - state: - - incubator - tags: - - meta - - defenders - sdlc: - - Planning - - Strategy - example_usage: N/A - output_type: - - guidelines diff --git a/leaders.md b/leaders.md deleted file mode 100644 index 90c9885ec..000000000 --- a/leaders.md +++ /dev/null @@ -1,5 +0,0 @@ -### Leaders - -* [Elie Saad](https://twitter.com/7hunderSon) -* [Rob van der Veer](https://twitter.com/robvanderveer) -* [Spyros Gasteratos](https://twitter.com/0xfde) \ No newline at end of file diff --git a/writeups/owasp_in_sdlc/images/OWASP-in0.png b/writeups/owasp_in_sdlc/images/OWASP-in0.png deleted file mode 100644 index d0d6f232dca3db6d34dfcf19c4bb9287756cab24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49065 zcmdqIWmFv9`X^dA!QF!-xVyVM1b2662<{dvxVyW%dxE>W1__fzW3YXz8{J(EJ+}Wu*H4J(jhqU$JRf)D+IEC|8pSuwE!TtYl zbLrZXs+l;q4>K`<(sI!Je~<4CCh6y%mH-#7QomX0$cSdxb8g3FDlWQIP-)R{x)1lm6O zjL2Lb9jdzdrM~30Mx}mYw^X zyE##}2$b^ijfZz+@Q{LB)SU~o8v#IabFnm0nkd84ia@j~Na(5{Syj0|ul~&IJjV_K zNCKNeSy7{Q{TbUlpI-QV_3y*Q!5wO+?JbMpn_>pR{*vci_8=ug=YCEO3r2@4p?jZN z+_`>yZcDcYX13s8qFj+M_pctk-m>`h1CWTZBMp4T4z_9$m1)AA*xF81zKo2j(Llw7 zia{yP&nYS^U+=^Vn|;B+!Bddk71Zrzf$U_#{DwEMwTvjz zl&XV^R0db{K|7K^VRX!Uxz;Zo`RK-6PFaLu*U`n2;05Dz8e3NyHN^^3Z<=q`Bh5|& z5SbQbwmL3T8dK88wU^3`%r))y$fHq#e;jcz0)H~VbHiN0uqAQgHu+H=Eu2A zjirE??OuNa&a4UQzzGX$7p~(5VhL{j1BE#PYj)FKR3Y%p<>fuU*sk9PDtd*@t@3S0 z4W{AZM-d22Y0#SAfSUF%H{X|XprDRN0sac|S!&J-0t11`P^1>u9- zT9E5sj34!Q5)?brZn+bTsF*^gO$UaT-{8ZnU5-B`l^avJ^ZMp-B>fRvnO#Z<4MOJ{ znfp`0At$(vi-)+)u+Ed&-7J*2>5OcsMVnbGXo z!{$DJ0`V=ELO%V#E=I!^2@MyqG7cD=HPXTz51T}^j%svmw#UGD;D1jL#?j{CRcnjE zJLBfz#!ZbGgAShs72TLck+8I#C_o27GJvbEDaw^kZk8ktzEXG?hgG#c5N(ET3_E>M zwa|I*Dsa8W9VD3xLq_|e{@K1eyj#J`_#O`y<273{H6{;UO`|3 zcue?hRv6vew-IT@VskWq1K%8h%c0tg5zz& z#St<;OWMeg;MA*Pr=fkx6~?>f44m>VCKeYTB%9JEa3wb1~+T@N3_bYfL z9Pyw8+Cv6`ha2kh(p1otAY~l&9Yh>)QnYRYnQ=xtj+z7@SxO7~%NaFWZjx%&Xu?ka z7jR+^88GUtxgjRGlxmC7kdQJ#j#O=`>o541&v}ao`XI z1^}J_?iW@B>t|EYEW&+uS5pCvwj9p)Srb~RC)lUUZ(#~(?K3bpFDvW}`ih&b>AEG1 zC)jI97=qF^8Ka{dpGAZsKG}3hD>6*QlnEnjx6=TO%vhM|)u!}*Lx-0OYUh>WgP<~` zF6NrJ(QwA|bF#@9_5CJw1&&c&l324~p|JP013bsh_I`eHQ<##!yf>Nxjv(az zdtTS<2s5>$0^*QWNnScXA`xR9*WD*)ZZIe zXO5`suTn>Eb&{r*=P<7@`wUo&vAZ0*B9jDm;S^m)od30Fk&!kM9-_wEsl}db;9yq# zl1A6h%{|$mb<+?h538wU=jus7TO*f+O~*z}^_wDhLa!WJv2J;$TT#U2(ztI8DPsfJfpMZ#M`Tfc3ELiKaNq=ArnNy>SYw@Bqgx_JyY@V`z!nky~2bQJ7 z<4XEC8?}@qESjm!_jVhtoC`X0>uA3~hx_xTnf5xh1dyy=Z6}f7)Gvss5B2ZBCP|c+R5%mc0G`Y^U%0noLyL zIMh_)b@Nlp+l1j$v*S6O?~B;gUQ(jL*~IN~YdVXo+2Z?AQ>)`Gc6Ik#GqylWM}Vo| zeR68J?^Exuxm)D@I|4OjQIh+K!X*a&n5M!V?^ybp$CxXqF}X<$GkBIqE}-RcwORjt zbEYjznby;x*t8EQyovsA-k_gz)Z;LUyI`9I#j=pCPsOr?|*bfq>q%P~g7Q z3;mDZS?ar49@w9mWX&})>U(^jyD<`QVqehJ7*Vl+yl$rrqc=!KO}GDT%!N|F*8KR) znfNBi`)OL6W6zKG!F9807gmwK^F?8&Cq%uv?{@Ngw9Rc(mmqda$j3FFJYP10HnYoB zc1}41U51({92^{IIlq&TONU7hE^Fz~W$+$wIg?ac9-KMWDgN=4cM`+QZ?B#eHz$XN z3I5{6tuR&5I=ov~`_~2gV_v#!WH4XjmJs<{WnLDmHYZ9;Ljl>|cVG&o&C*jz zfy`eTHh{u^Fy@@OJH}|Bmsw_sm(^WjY4UjB8q z<$}cdZ=oIjPsGI29l;deWZs8f5$T(w$YVv*r;%BKGHECQNqssMf+_x8pERxqSip<@ zbs8qXH?@m)5_N88b0*#AMikTjbTUhzNT~c>sQ>1ix%ukv&L-3RTS~@L^|{U?4q&VB zdVQSzGG+DnMtB%0y6u{(&5?WM_w;8IC%cZfX*a;N0e_6@W26DwwY~J$UDl3?Fot`P zo87nR1h<`b-p>-x#P8GX#T)H3#{EbsOG(^5h zS#o;qiPb9FS!EzDl|~zye%e^>tC?oRkX(~&>Z-rLT<@@rQd`fxu2%(Cn(H#igr$e+ zft)d~n^l4L-OP*%6<&{t{%4!cgm_myttz;}*MFnSGq*5n3HSF7fb?wj#@^s_!=4=5{ItGtcOEPLl3 zr+LJ)6?!m-OHkdur2QJ>+^?_F#^+%ZB!j)Z zdCd})a{;&+JBkO6>dBLGpDXR7u)~OpQGsFyc(TXuPrW9&!m8iESk!%Q2m5$hm%Tmb zVT7_eu8Q?Tv#V<19~G)}q5P^+XC3J}llaz!g#Vd-y%S>_#c?3uj?k>l?YirS@U{b{Lpr!~Oe1x@BwG)9^WA!4(HT!NU$r zGXLs{e2(rJQ>B(5+BQX2#R3bt%s^ z5w38gxJLBb(;w)a(f=>0|qQ+^(y zfW|jTpN9>GAm_dCi4Do_#B{Qsg;JWBt`C1=r2*pT1FNic{nv^%@I8kYifpj4J{D$R z_;b&*3oNMfwDT)Pumrk$3D?HPbO{vIw!mk!o>-Oq)L9+La4%t76|`Ymzm1-0hl>9v zcR6To^!ku!>hA~~Qum=Z-~VK4b8Mj6c3fl6C@Mea8FoKS+#IKZ$H3_R6GC^Dc%L=} zI^Npniudv*-uGt5csSt7j=l=8pFnUHJpIj=YW*I=^m2d#hUN`8sFP`ywk2gi`Slc9 zb6g+c&jK*_<*ERA@2mvPU0T*su@e7?#726D{VDZWw_L9Db7cJ_ff9s{TvujB5JmLM zt%7ygANeEob69nLS%v!GfKhnSt~VblBHB zygMp<=7;0(rI`dTiRLr)s5*+WJXh&ZgmMJj6wbD;mK=RS!S|c*An_<)H>$VX?}FvN zmzH-2+{>RV-#juM1t=Ha*4_r4m=lMYNCCm1JNIjrJqiByj{Q^LtTs$J-zRU8!(EyC zQls>c&dujN4qs6QyPvzlaAOH4-~vkmn4O5KD|Q_>W9Vf(rTQJWK36-34`^V=x@;Ss^F4J!yRpl>lNr<^|{YhoCVw`rm6 zj^C%i;Ye4r&FOStd}L5gh5l`rVwlSvYbgJjC_v(m#eCy${Qz0v388ExL)doHP$OKG64 zAKcQ(7C#F`;5^$+upb_hc;UZ4TzXRjOT8~+69C|KH?7sK(&*cHgE_Y%A|cQc+mY1T z;JbH4a8l0igwc*5y!uDRZTXWSug{F3mfK3?R1FXqq#V+Fc~C+N%%yPA`9T7}KfE;E z#ZW3SD!A_s8|4F;44A7cE7$UTznS`GD{!6vI_9|II@#g+D*d$5=q(6Prf0ss!Gf0H z&o@Ro_-WM3y03bVT3ce?)-w<=wPyAFc!)ah24(COeed!0In>u*7MBW5mN8XvqP%uI zpRvXDFrx|eZX=~nIXtqs63~5p_ms|#8g+i+1UDmqmM~{;GfS$(jXYC4a-}@b$oHKJ^G|uA7&vlf`%2JJ= z%cJ>Jy(`3DiksWP}Ifmb-%CdCJ0aKkC5Xy zs$Q#UT+RGhnK-M_azV9~lSALQ#UXMEX5dEc2?h`0&=?V*1dqlu@EoQu3c$I`Q^A1X zc~n4&S_YphYUhSpvq+P!>jaYIhImxB{i==l#l`9^7bDNeut8)RhQ{Ddjl2~2WuDBR zWCkFWl{y5FnEG(G>{H79K8gHW8J4ebBB0ax9@?s{ZVPr&>2rk&JjR#T1D?q5f2Q8@ z=dzf~zaa77QT|$M;B{?jdpbNi3dmjuJ7Q8zJym0o;6yXC(|KGUzZz9LYn@yr+rLtM z%BR7_<1LfrANIBF=!nlVYxd1|`0()8>eV#$uEQC-3ZYvR6;rj6ZX--ijO>693BHe2 z3BN{VRojly2pD9Oi=-55c5Gu*BmNo~(gRyTXaFFh(V?{>IweQ{z&1u2}ab9f$yAv9t> zukSMNNY|Bt|8Y5L+}wQJnAHb!f68>)JE9wC*q?PZ2dGN}@JGR>Aw--n$~RjbcE&R< zqV42}im0!e9f&4{=D`L;Pg=XqzqQyuXATSK6dQ0iZ|m~cpT8ZR9v|^>IJV-Jurg^m z+k?-n-TrRQKUZ{Ax5LO0_LhBK>gg*;WMAGJ4M}j&71TC%XT4sy@f67ZcHSP}?%;VQ zi0FM0J2HMJ=f?*#1Q%oX8kODhmbj86;<;z8KJmNjNJPJv7b*9&cHFLVZo!jh-6bEo z?h^@AMdAFcN`{FP9$f|;z?zXr=ab0V>UBE4hnGl73K`1G-jXa^CkmSjGh=)*+4UHC zZh4R9YD?zGB0aye$(-gp!VfL@T_IiH>*^B1(cx;LLaWl6O~9Bck(a;(Ve?yjB9!~n zggG2g+x%n!^`Z2Yf%|o?`Jm-oNwR$y63!3(#m*8#%QTAxyxtF*a0a$}Pe=OamE13` zd&S+?5BZFaJ9P*l$Udk2)m67M7rkr}vY3qVtyc@hyGfPYYR_Y?M7{|v-qs#bdvoFY znS)s@K9xyjDu35*2tfQb{!}>l^s7gfHb)d$Z@B8ldDITA`09yeD_>PQKhCBde`G!65aF&EvNo zVuq|MC5J;Sm1Dw0Rf>-D zn6q4(B=eh(;-`+*yiaYzZyNssp3x`1Z`IwG>x1Q2&9*w3mCSSB-!&D`@25Bnqn9r* zd-E|_Sgvkcxd1=D74v)W512Kzv!si%LhgI}xSxIQg!`e!@X^x0K1ROly~ve`xFr(u z{Yp6KONZbX`rt&H&9t5oXaDd(Y^1l$&ZO1SJZ~=k__y6tfex zJ(nN<5_Sl&9-{>w5@Vz{f*}-`{|V8j_2bGksQ(B;Q@x_8uQx{s1e`g((=~gdih)zu z0slVs;SDGM=5hEhMTewe)Zoj%g(Bg01oHonn^iWh={G#z||2ER3350%MD{N*ob?(fi zt)-=-xA{l3s3wR8JEXI!cU*$wKe+%CwW_z&(a%~dKZfbnrm(_cR&?I%A7wUe4c9ie z;rhTv)Yie>^9JX!epYj9$Sl<0dS%xahHPFej)GpZOvO9sHW>0Dq`hkD$CtNHaHK%* z1B9#}KJkbTO{6oeSA%>wRLs|7m*+7JiEvjp8KiNnsUoym4;RrZLK-x(_9qf zhE@;qt|f71<4pSVoQI%=+VaqVtbO%^2+4F!k&emb?d+whtHgnO&dhX9WN)gog)2lKx#+0;!q^SS~NE&B?@}JJKu=Ymj zdbm|3YS{ebk_1{FJWdH`SJA30*nm4=LF&N2!_j{v&*pFnWj?`=dO)4VwuL_%=k#nb+B3z1P zF8}=cxSXb(NdZZTeW8_P%%-ogvrD}D1hiifJ>`Q42Snu~21qm42k3nS@$l1ZzDYyp zfWf7PD*94>F~LlnIQia+hll}O@J;YrSbfP8`9@M*R?FE5QlkR|&A#BkilJEsP2rwS zG+{;Q`LGFX2k`mV5ToKvROu_N2C0xv31Fa;P2qs#ljCQF&H6m4D;h2PE+N;QCKg-% z>Zn-J^hZC7ppw9|T7z7gwZb{VnO_WuaimPH1A`q~bdb;yhYePjZLZy`6CwS2THb?* z*9pI;s@cSTc5vBU52#ccRM0~Qi0zLaEkq=&?{pYi^lr7NfS9jc=t3*cR`?QCtqj{a z&0no71ooL@iN(CK{ARqW>h<87GBLS$P@_p_!ldo&+jJLpIa-obb-g%o2to_5AuF33 z+cKS3`tw%ZClBE*0k_k>>#YU#m%E_2J_wMm(JYsKCl&zbHTkLg#G|pd?QdE#0nynf z1d2LAd{73sV#RQ1R+3L1-;x;6&lG$}5UNGe$o!fM|Zzau5L+xt*4p}`{bi+-|LSo`a+tbw)-wz&Kq ziP-+>5q^NkNB?PYbG@<|sjM61wsmK~{D(W;>hQQ>8n|jX7yZdKyU&WDw3GX1%4@cs zYc+!av8F?dyP_b2;1gu9@nMH_FI(Fh(ri`BbRAhz)6$q|jc?A<@@F%gsHsyhb*AC? zKttbm#%wi<{PkUX2Wy=V$Z}9>udl6moZ0QBpK_56ThieTB6r9XuM4CV|M5FFB}P@H ztsjC^!iyr9s+}J{JPa+DiCc#-B$Rr9ds(fxZy=~b82_}A(0u*sYT!9T*Zn@H87WMT ziIG(=B3X`Jz0)5Y2qi*55Pv8o$eq?sU$0b?8+#Z2Cm*AJGFp2jfYA0(8fz6<=omD9 zW>%gAITYchAjXyajR1+FZq#E?H~mut+4gV|_>TK%KUw?t6`9vbXJNUIRhYE@N7sf? zadSH#9XT8^;df`L38Qb)M9ZqGa!3rw0g;Rg_S80KcaE`zi}lI@S+k+Rj$Iyfl9yY8 z27!}%s@#sst6o!a{k4LdiZ;|RR-J{WmQ2{v?N=7ee~;=_596m_4IbxT+Z#zJB)}o^ zJ5p3t*j%lRzoj;PE8{SQQ73?38ZC^}g!9~ea@VkBC7>M-G&A{KF?~_B4w3#2nh>kEhl8U_rZL7qFht}PJ z>ZkFmw@9s1mKn&b?e8oSnP)b^WhTx-(@MbwtUw|IdZbLySFUXyCP*xH{GH!t$Cif4 zNTeq!Hn3VSe9rx*>TG2Wxi%!wcmv!D9Z4EW;Omzk;nw9V9byterd*WnqUHOjl?i$X zw23_}PK#oNn{|Bq{6LID!F6BF#^P)bIPGbSS9HAub2=t}+IGk9BH6*xn$~u?JBD?M z=s9O@Gd&IVe`X46g^k&L=c$``l##~X7Oq95(vS(+)KSt#1Ucd@eQ_cfkcymfy2~ba zxHf;H zeJ_D=Ev4^TT+W_}lJGcL7`ibbG<2or{H){pY)`##tk3P520DDZoy2zv?7B_VXE>cH*ib4)%kO{$6j6-q z`z>_Y4b||@?~zS!Cs@|`n^mLWkM)NXA%*JPyw*pR)B#0uiJmg(>dE~^LRi9vc!nz@YvRFCNx)&Q?*Gt871W9)n3!U|O z?CyP=0&j{Nw=$78cl0hUOnB|9O$j!%8O-h6?Y?I-<`U1r3vLEgeYwS)=~7$y{XuY{ z78!qRJRH`=9g=xb4-krO>Ge0u*FidFB@{!G(OwBoyydRW*#f>3y;34?Z$X1>4nImP z?>ar+=2={R-c+FqoA6J~6D_hjXYuSirq<w2u9WN1Y;-A?!c!K#@56_6$PTiK|Fr1~FvZt$OK2pJDR*-+6R5>rGQ&l5_8=FG~n?!R6b;lvh8;@wR^z+X^}$sE6|F z?DA170zSK9Nn*fk*2LJWwxyn zu+T(BO}IM!uy)~apzU2?ThvJkAX?#{s?U$1_apc8%^9Igb7HSc!%Un5d zLmwxe%e`siObkC zQ-2%&hCuimFiNwv;9*e*GqSVWYsD34q?d<|i+?pbbO_z58RA|;LeDq-P$|^#Q|0LR zWMWCB02Ij97r{7knM|v<0=j{Rj%h2sq(Qkr_ntk6WdsD{y4JMuGPW|a++Tybx8zB= z>N?NFH*#4?+)0M5MbPL4ffzs^LzH=>90)1ORAXYx;UE-~Mq916fBxWvK6(BZW05#a zu{3;X58k-3Jx3kd@9zZV^L5UZS@Gj$bU?wE-VU=ap&I9^Cg?Pxr~<%`^b@!rF;$$7 zrkz&2)K~I2C_juznnp8SW-JDvz)gthy9b)&T}yL&eq+@9jFxi1dcjX&E7e9)35K6V zYU-V#)65yYmidp8UL5@HUC?AaPct*vlo@Vv8f;FIVm)~iwNuNwa*eLY{JBjnI_&79 zI5tS(^x0^mQO(kX9%1zn-HW=8qR#d2sE^z6}d1y+4O(iwi zX0Mt}&1fww{6aMnrUj(XAU_GB&4o?j6Me?Il_P{1v}lA*Up1u>l`!hZqn_tUS`szT zVaTeeYC!Y1U#71>w;H*Z0E9t~Z57bLOiMadWb<7$2BlxM+sZ}*e;b`KPmBUFTgH|P zJ(jt@kVCH3ibt)ctd`r%igAs0LcuAQW%c^g!W+-8+M*Y$emapw?_E(->+bW2q~bjc z8%cl;2}TpD5Oa=oGWiwqLvt+`RxB1IjT}T4v!(Bgc46{lRT;F_v0<;vru#i;G+iHR z+YSm9x$Xaq{sj>(wo-Z; z+m7XEjcd5IL1~E;D~%pR6`vzVL%s@wKrUK{5lQ5Qq2G-Ri4AL7wXmSkcJb#|aw7^X z(uyqcwncis%$~R~*3>4sESe2grCYqGbF#+Z675>Hmup&2EZdCQ%@p_1{!YWnr(q(pg`*;=B!ynlg5G=2 zp={98ddn=7wk4zgIij-dG&;4-{p*VmfBeMkUcba%BYX5DG+^DyQay*2Ou_{Z^I9wF z|JBI;&q~s+{qCI@JjTAwE-!;V>8W`dLg9>AnxU!^yE3qT)QzchSP^E5%}uMie>D&G z3tA7yl3Pt8`}4jjKK>3_zVV~j)tCz0Qh%xlsT9WS6C0|@A)FGOmpmFIB@~q4M9~#% z`!KdX%8f9yR1Bo#h?Z*GuLBDs?^i;*z@0I*^u`ToFbp@6N~7EG$jIHBzLFH`Uunu2 z8ueKR*%YbvXnS=!by!Olt7NfPs9gL@<1ECZ-U=c;NvyU)xt@`mc8=s zMMsS+6VoanFNoJ~DCP#&GLc*^-<1lAY1+1VN^O!1miytcM)44(P_HHYb6^z{z-4b5 zItWw&znYic$GxEQM6MeQb0(-@qc1pragZ}46p}!sg?L0#vq7;2<|)|q?ofi?SO?}S zvrKLfBEmFl=-+jU&57eCz!N;O_-V}inHZWFn`-mX0l-4ltE8C%Z&Er8JPdpfZInJn z$w<$bl@=po4j++`#N?N_Na;rH+yI1esvEfVxS9qBV->CyoKfnVqzIGA*g3tikpX9; zNs02_P*V93vqrfldemjzc;BGtf`bx#44U%eiOM2;Z2v8_xD?pPNlo-a`wDjp_s1Zq zom;Gg#Zh_8Z>_;EjiboVtUWQMfE2UNH30!q$}`_{z7i-%_3PzsE zu|X~;ZJ~GFp&}3sDd2k#Juy+NjZSHRAl67#2Bo92>8AmkdBpyQh=6Tl%S>nNJ^Pd) z5TBCFEXpMPXI$*QA(ZMmo+CfVp=tyvYg6QianC4pbY3ESWar@ElZ}Za%t@HU(C^gs zql;ELFZfc^)~t6*+F(G>(upHOYpLjTjtQ`U?`wlMtjP%*K>-=2&Y5hl+Duc+0023E zO`!mj)-|e%8e1%9WQ4&nC-n#gX|IK)7ON+oR)4S+?0T~3;Dqv-$M?F(Oz#C!0n~6Y zh+>hny@@;V&$ULYa5ls;P@T)f$Yg<{y!p-ensgFD#-RnIN1WJ*0Q2TKymX{q_F@4U zJo+0pIGMVz#R!>s*1B3XmUY}n^MsTk zt+jr0BaFN~x92zxZg44Oz`)^2AM|t3s8*xJ++ym_m3#7d%<9rK?YDiNg1J$7={a$$ zrTyrdvpYf>5h1H7$F>&@$5h1IA_vt@s*eHnx+UTM5uT54+vOs)rK{U?pp?i~NHnkh zehFDbY`%A4*U@oW|1KJ%XjR}`9SQdlAP?c;Jj`8Rg;&=t*0P$1Ymd#s+Ac*PwiluW z_E}mjXr(THOdPF52Eb=%wca|JMafI#xl&MJqkRp??+^uNWJ92xAOMSr6ISa_=~)IEke6sipRI-JH#~*FzUy17aIS6xBCp77iV2d%kNx#!Vkz zNg39vhT98GA1-?D0G5pPhnKlE7L4hV2IB-5z4_p#%*+5lr8jg8a*0oZ1jzIqd@aQD zCP z+|tT{3kp&3oi-AaE9Dr52Z-<5u3|#j_oMfZ-lh7_t!oOWhW<7ng(?-*F#;iGBvISi zotEX`iYH{fzgB!QHT|q(Y;N_Z)ziDXL5C$d0fFsry_>2-P&!~1n zFIW}rZ2ABEHKrhzrwLtW8LFkk#QG@)kBA^^$VzTOym)YNS@inrwCVBs&@`<#b6a*r z8KUOTV#^6zx-NP_`f2^qhRDd9B4*W2uH&kLu?yo!N6psw^X(0pyc9Cll^F#B8;3O| zoogd7=Dd_*Ttv+(aG9pw84B#kC=zBPkH`&=XmgPz3(lE3JV^#54D9ynr^vF3F%4fu z#@3Z29g$_lHNA%A+GFytwvVWV*NLSh{B)N0`*$b;P4tV@|YZs z&WQQ>09iCHRaQKrUsNn#Gbx!7i-!gYSyag(H)bnD981sV_X_^ajD>t!j9R`oBOCf+CV=F$hroDV9W1{s+}7I?wP zP}KLJL7bq`OoWO77KekatON%5v964T5f5bqY2(6=o`jDfL%V~N%kzg#DZcnm^+4Q& zF%m?OvZP`N5a7r&c)A~i&97+MmsGd7#=gBN>S)E7Mo-EkP;{qiu!Oec07G5L1bD2;ThK01!9Mnr)qVk zVPa~}c#H>7!)^&~{t8SPHi<*8#jtQ@1&pm(%|f1GD3nqoI8hM-$&8IlL&(+U{-NGQ zXkU!kzX89}xVU0tA_?FDKr0hE@M20-DIyyA35Ei*P&Cfk%4Y6U?uJ3_Y{Y}Sv&|^7 z(&jl%c%~fkJ+k~yDklB~0akYgP|3*$&km>htUb2Fjw!-gK~F@4yBBZ7i+1oiO$lo< zUz!~aZ%_H-3J75bVC%hoJaW+R5#)ZtpGx{xteIeq*fhsX2f1-A5&bmz1ZR<%gwiXr zW6#9JG=u+hH*s4sgj7{j4dtBl7sL!3SC)hWD*T2MNbzSLy5sm*BW@v!oOOrE)8gd{tB9 zd}I5MQij{xkou7@E|=XE@z#xo8^MIqBeId3puz=RsnjirM@P-n_-bZ0G-|@u+FyT2 zL5-DJPRb3f_V9pT9L^EG9_QyUyzp_wCUBYN-Z%>Exccg5J zXiqJ~XELJTT)B26!8jwD^SBq4at7vdsuz0_qa5*)QBh|uPoHTWhtNqXTen*iGtN0v zr&F+c)Q`^g(Leua+BlZGhm`L|A!hX`|5hzc>$8F6@Bh2L*deEiiDzw`yzb;0&$LN+ zzLiH8!k^^*5KOF)Wkm<%i~-cpol+zUmK@Jnhm{3e-*_B10tO)G%eS2O8_Hak70ym8 zqfER!&Jf)lqJxX#$s0~YpkR8W)To9#nx>N>=s}QJdUi9hOGWroWrqcX(cKPh3zJ#A-OXStsN61eK zAu4QUAq82PmLI5!y^-`GMS{_U9oH|$OZlFE&;n3MKdJWZk>N=jf zD31>;LIfF?n9?X%D_Tn{4PBvE87#W$@3RQWoHEu+C>}hur4B_D?6Kq%Ro1;{r??|c zJ{9Gjiq+Z;z0br*+gVz1tNot7+@(bikbF%C*0N{$LP6 ziL-cnF=$zV5>S1zpx;zUjh~iRoXI!$tusN>lDp>W4$#!aFEX=pED~_KYsh0-iQ>={ zH=e13i5+c>WbO>rAyk)9zeSV5S4!oha_mTY=`?v}@TI45ydrZVk3=~^klPK#yAI!2 zaIiOt-@yWayoG_#fUexqjt>vWGkxg_vxIIPNhVuImfp_VH@o{(fVvFNF;hsQVnm4D zjh!~viBl`qZW5UkoFPa^*?K3UY@4sd8DG`1R6|tp>SE;(y?WeN>6m}ha8**KeHEF5 z!)0Ce8;7%nMR~h2(wKV3#*vjBTP#q~yH0xttz^-86m$!=1Em&~*;^pBt@ds2!+5TRmft$eg^pn_?EiWeti+(zZ> ziq>NrtpCbg~9`0W&pa8_z3CXQwUnaEl&HasfQwFfeJGk?3Gr! z>0*|my%pJtp%U#Bs^l>~@5Gfd{TV(K|J*XZxs7eLGeyx|P2_l!K}okUae0XqXUJlt z>kc8IR{1OwCW1@g4BSVA>HOS&vrV!RLx;cy#lJK?s;uJ}U?~$8jIyGJvAC818|+m) z<1U=v+_su7^VWy90>1ryaT(Uo#l!Vd*EmBf^uKCaK2jCrD@Ffbic`9SLRkm) zjZoV`ne;Hi2fqjIxwJhV7&`DmkzJa&v@DwN=m2NZ*-^c@O?iE6+z$GK34EuQ8q!)xPePoUS6Bl>whp-lOZPRv9J3x%bl~& zYrX}|JqY?*=nPRG;eDu}9C#&Um@&AQSz$GZT1-6(yQ*w^MeMG8GFSr0)*w84ULlUm zYqpvH!4k(>_!4gX`&Up3CD^!D`dVevcHw>8d`c=Tv~aAb7KxL1dwpe4KA6GjHi?tK zvW6X9!GOr`+{Ywa$0jbWwk2(`3HiRSp$&O6+8MUVi6o=GdPV5||DA=57CMzBgxsvy z<+eF;hKweFgA;M_VZItS(A~6&UHTo{aH_vFU-ql>92&?7OcUC${FC|c8I-?wMhK%! zJy-LQs~k*(0Qoi4CTr@$6duh@J$M+l7Pb#c3(mghT5i8Yk;X1M88Kx-LqO^etjL>L zuk?4zuBSOCyjh?Vpg$I0VKyWn_mDnwFss;6Sz0@FWu#F@Qu?Slz}c#IPqZa5uw{%$ z<}NC9(Z{~-p2AlK06|krWDm}W`1F5SxxaeMjCq&5`RHsy^Pz#%P=j|tP7+k^{Plu} ztCLjzVxcIfES!aB4=oJLs2&{MFHvb*pgo2UFla*mGUk0SCf+!&ZwWq9GUt7bv9n0%we;l}=5 zxl1ZYa~?9`9|i2L>)v*OgzWzyA<7>gR!7$vdsN{6-EE==^TRm2j+Q1*KG$h(_D9*~ zGTpJBga=>Zp{l^UTFu3^(U&C`xv%+Pmugt#=iNy?pF#&M_eszP!6f z6Hncd;zv9zfK=|*9a(1I7;Y%7%fr+^r<0uzU7gF*Pq-?38zxw3c=rDI>E6Wpx9|09 zRR=fxC&KH8LAUYjs`hOcJodcG?r-h2;Kh)`+edr>oh$v35br^ugIYg6ayxj!Ebe*i@Y`s(0IV9;CH=(y@yuCR%CGHejCwuqZ5xw+7aMoz%I$Yp z>s&O9R@dN6?@+{Ase=iQI=S)H@Foo@}tCqDN12+Cz`rl($c>yy=!mgJTby+ zk^_6lh=Yj}@#FW8>3F8QIWmcq;D3@!YZY{ogbdXD#I}0FJ;EmvG%I4Kb}(W4Tws`XI}y?zVyZ7pEE5B- z_AL56C{JH3Bh4wCa(?jl(&4^ML~QPS5e>`74GxUE4`jH8N}J0dbfgS^K%-+l5dsRo`Q@g@<&{Fc~ zejjrCbR&rU5m(~$NsD9~+1tbYbfPa~Di!g97ik%Jws_>3CHVT`UGJG{A#l)ihdSFVHK$MQlI5NIKD+g3P>__L=&HSaJDF;#JG6 z?PRbM*mf7#m7(F{<812_Z>$k7AQnw$gm;^GvD}c6`1TJb+`PVufL%Y9 zG+`~LgjeuY1kOv!h*QDBDKGi==G;756q2~w^1PT1_yOcMM7fvy0@0EqL|6nClFyp5 z2{eFevaCf-@-cSKowzVul?1oI6^hZ>hV+mv&5V4(_IUYrubA^Ga@0xU+vwE?u-?>b zJK9KLg6t3P=GPFb44+o8WeqIdyi7d=-0pjvbM+Itwhx z^6NfAwWRR56BFr&Yw|7=v)8gqz4ip!B$kqCqLjU0Uq_K<=`*+iiHzFD*0DII6LmAJ zw0NI6h{C}$&fV`|#rfcG0}bp89%(mVflg*i(}uJo$bG71gHB+~hX-EH7NB!UbC5R$ z|0$mJ7xq^_t=x3#v|xv20^^hKrzUTA%M%t+78* zHX(PVO?Y4pql+HTccX7fngXueO+3+%-K@r1_`Phb7cdMx5@Nt@EB4W6K4w(d)0e3M z8OZIW5NziSk}*8~iFTvPJscWZMX+!^3ICH3qZx^PF2byMk?Tq#8F1Pa!U&G7RS8GN zJD89hPi2n*=k)3~b??klBxKgM6|kt$u=zbE9eCg8Xf?@1&ck_^J4xDXfm^h;^zcuD zKE=v>25i5Ne3!p$-S}VOOx33K+rHgjG-`i4E0pj+xTy9y)hXKm-cp-H%OBN$AFS<1 z6yF|DWANV*J;tP zoP%Y>lo-sKU6cEAON=yf_`HR0!gzw5LDq9r{3)5H+}OHF`NW2sDI2-US_6Kd+V}Gi zHhP8s67fV62WScr{go)_azjQE3K7Vsvk;o;7DdlMeU$Imw!veWP$|nuU*ES^%x32L zb~vU=T#CE1d@JKe*xSvS3bP30(ul7g%^Mv#wqi0_EYn>QDXA-Gi{u11u*@ZM0@*Qi zL@*i)qA%u6N%8P+zl&C=$=jFq2arRNX1}^Ddd8UR7U%0$6*~BK5u@8YO+kCdfxEF& zExfhb$@=>6mab{nRjG7>D&mYB6(sD5kSedhfZ3NlU7RJO4cM1`guQ}>;Q$q??{kZ6g8naH+!Xa zv|HGE1kv^l0>+I~xq%MAmb$Vn(NJZX!F`UR`cv0q!_v^-ZcayBZDv5j_zVGWx5I-2 z4lf#V->#;WwL{B#NOrdy;?om~W&zXub6GK+UkxR)Ii%H$GGga_nOP0TJf|EUBIe9d zp`*Y}v{CuI(w~Br2prfw=ipWQ+rg1)9ftYNv<00#*%qy%XfC3Z#)zOWg=LXn4?wk_j5UP%9n2i4!(AaDJd<}D2{5^kEE>pQ&NL5Y3I&vIl z{e2Vprcf29Y9ON+S;x2~5AYqr5E43!T~*b@5B9=3I>~7~3|P#m9!7N4el_Q7DcoVq zgSSyL4C&F0p@s}lDK(0 zL|H=UK=-_mage2&bUC`l%q)|wL~jnIz6`(KT%r4{&)!x&g^IuKmeeDAmhbx=xCF_x9uB#63I=44HFPDtC_!EEb6$HjXHw%HY(8sLG6m9_Cqz zn3)sNuyZxZL%y%7V)iFZa*Q1z!>9N6s5A8+6+|my5tKOG;qAM+h|!M#0vo)RH*0~0 zWI3V&5~wUl&LRo%lMDwRmL@*7l<4d$Ge_4(nyHz%5j5KxGh4`%(+P8rO|NV6QRr43 zlsWIpT-oP<6aS)Bfe+x;#dnM8G)+Fg7loOc!Rw>3Jc}KufJmI!&L77m4kxifDHdxK zUMf~ud}D-}#(r9UyxHp|fIveEGK-oFCi(T`?J>Edwdg#Q#1Eh@XXJ+^?`n|cZHd<) z=YCWSDoS-y^u?lSx8LtJ6WNN?S~m=rmM6{N5&$(p+>+(uVr4xKq0<4uMV8oC{rRxA{}rM@>ZU6}XZrV36Aa?3I)o*;fIdHwqQd@d8vP6<{8#H!JL`Y{737Ba*V0$NKOyk_tM&izzhcP$ zyWUTv`nZ;4;s3K0&<6`*eZ2TTw+U)R;6Q5+k^N&2{w~so0Kv5TuNLHXXb|>)Z1%Bh z!*}=N{o+G7pXlFqXJNPN{iMrXX!qmwW#i+WxcFb|hXr*;P@_8ezt;KxwuS${4onz< zPp%AW=J(dtWVl$XCMepR6AwUlugEUhM=F_DS$`^P!;gwv?XIl4C@K55Uat@p+iB`Uy$ zi;xh*9~lFygp4->z7$418cBO6s@Q1ok?E=A?5;L>`W8JSIL=t1>_fGQHk*ifG5*j# zKEMjUGHsm2cfgLw{G?`G+PgaUc3RMoQ%D841d>15PA_q9_0s@_q1!U)PtOa>Hwxot`AcY*qO*~x~=AU2FIg&?OYCjWF-dKeCvVTLG zsM~wTG<1^qwHWYC;`fZ?nn&PmD7n!D+$99XNTOSjH$E|wls}=uhE)Lgm|Hxb0O)75 zWP>;PxpZ-(o?8=P)?%oMsyMvJZJmV}e*03%)|XRXUefckyYhQUF0tkfWABmIRRBrH zz|qg8sh%rsT5~UFW<5%UkGlpME29kWTNSc*lf1>tcM5e2T7Fg-qYsSlm`5upBE#P= z#5^CX4@zSm*#t9%10tTPh0jGpER$a_|BIsptA+ED9%CX$a81MZ|q` zqI%MIzgeuN;P|evMEZ-UW)+tfnzzGOH=+&`(Cxa4UY?qmpBXE}oS{3?)LApJ2BHpMN9iRPLg#^p` z{3%$m)Ag{PzhGXb>#QbN!>aKMfBgE86a6;XPXm5NlXRJB7=WR!SyHNQ9%kM}R-L|; zt0V@7i`SDU`$VE+$(a@JM-j-25&wh#Nf0bB;QiU<<&cxpbHUM^IZ>Dp8(R1I8pp{T zcz$wkT$mY0Wh@Gx`w-RjI@t~Rcu*yx(em*?cQ)v-q|CI?R%_q6Y(gPMeoBTdqI1_C zI%>Nd)iCX_f_b6ZO2O`(Vu61(qm}P&YWnf6fCrFt2skG)jk~RLK@~0zfdt43JQ*;U zKAR+VG|IQ>NvBOeCp&jgoP1*M(cGq$+F?+!5%St!-0_s`Qf(Gv6LWX&;$C~2CW8R{ zoK@C(+9YpMSbw$29BEL0wwuH;`7v5)8<-SR9E)2@&t3HWXc3`rW_WXZJDSZl()jDN z1@Z#DU@@o<<&GnGmYI%DqHn{#sb+CmpRB(sBC5<7)iE{}4kNm>hSc;a#kaa7ugB9< z)i4pHB_Xv~@N}(c`gBcVm9Bt|u`^wfD zYJz*%3RZn6x9XSXXAy6}vfcG=0}c4NY05RA5jN9{xdTIAsG|w_qvf9q4#3riE#b&Z zxrYd3vsI@D?!ofP^u0MY5W98heWsbOAxqw-3fYk@EvY?{No+`oJ*w71&!ixdVwubU zJYZ)Ez)h*PlttviM1oObL{rCl;^!`ZJGZ;Z*S@#QWS}hRzl)H;E1`j~cROuP^kpH* z+Us3NMQy@ftX+)n%s}=C^cYE<85(3%h-Mgm@IF=HkAUcI*Lekn$LAi8o2s_t9c(#b zjl_$&PtoxiA;V)^@Px(rraG7c6l=P%2@(O?kR?Uy^f*@!C!)VGw7baXQbvU>}uo!ghmfw+05hV-wR z-^v@L&ePJuaQ?%t(WdOcw$LhKMRt1K-;3v)w{mlSzE$ssqr`1u z*S3XGTw#Hx(7odTr1X0Uzv}fP0Ry-c38Vpd{m#2C&v+q; z&gvI?QKm!d#3FN>B8&DWOjS~1KG7RU)izIwOwJ+759MM_!#w`jyH{t)`dfElljWGsgSnLV=4j~ZRHOLLr9@y!bAKVXX-oUl|W(y#C znf(vx&)~)X+NgKk5gx#r49z|O)zNH6b(8nl$;eT&x}-&YjGq#P1O?dN@vdRyBL``m zx~l?s!_>CpA;}PdbRJY1l-ZLd6uZ?KLTF|Vf*Q1hFjx9ox`GZrXRrG!DKdlwK$T7! za&U_Fo-L+ZR9ie7FEcmiSy=FQ1l9`;msxN!RfN?Z6{ScF-<+?m8svJxCmzpuckQ9c&)c)IXbeNdh0 z=4|EL6KClFo0L07Lkq)kx$Ghxzngayx=OsjyPX49C2X)1bR=2Tco|IBQA2KwDnHiKemYpqh%rQEv@0ZqmvitOw7@o7l3+$c^^NrWNv&i z1DM{lEB|>)@M0EbnmqDHkSQzJx%|GDqG5@0k*3DsV;hP^3oQ_lrY-sx7tE4X)l(6T z&(4zAJ1?xz)ovj-618*a2D*NMpOOwDkxg&K?Ysw#RDJoi7mmnKmLF{)Z=D|F+LAN> zSyanNAJZ<2Fm__aJgu5~h@0Hy*_Yce8Apfs{;-ZBh(U2-5#5>;A8(Hs`|&{mcDK4hQo9|!C*uG7$PAf% zBe!OVvvpFi37x5A;`)_=O%PeW4dQK}8^*1BK5+QcZ&3e|VVL}wEOCeuvf$LAEd+%O zeIr*OQc|l3bgDs`WuqeRy|_Zf!+}R~K$CxGYNvw<--34I7JoPB`bWm|eQ;bZit4tn zSgN(p%T^Qt+qeNH&p36s@`1tNM7<_oEEu0#9{-vAgGeBB8AM+WxKS!Msjlhk3@^6i zCMT@jUl;~e%Dm}ByZ1wsL$@v=o0>BHRz$bl6yVxT+Yto)={Zza80&tDau~7~r27s) z2bS7!!1UIDL`qMxY|onv!2exR*3tL~`#3&cw`Bj#4ibaEMG&-cKdZ4~qj+0J_5mkh z0f8-I!Kk-?>RAYlh%mI)_K~3{+NE)7zxaod(`|?jS#K!7`5izvYcs<`14 zT>$8=JvjS&k#{%>g7(F&jSDgi3=p&ffPBF~h-#VCB}NSD$Ypk*XY(G9rAYiMGhbg` z(Uw2(!w0rs8ZI`~yP<>ty{fOx(l5yc$+IBRAjtkHvbM7(s0IGF#2bt4bV*MN3sTR8 zd?`0GN+X>HGg;@jl3eSAGxGhmOl4p>nt&QUcKvvuX&Q0-@g76zVtXV1#?CyT2oJxBHu2cTdvFH-FDLBvj4J1&B{%EDI7-aWOKy&YzMak74-0@J`Tq? zYsVg`4K`uEH`O6KP1#vcPU+Ks2cV@&}|(UkQ0)CN4n-TLlq^++zBgD1==SFhpML5j-bt(d<8%HlX!H{z|gDw)8`x(Lz*whr# zmv;E6$QwO}7FYyxCS7l0!4 z^em1cT&AtraB(}T95a_x1iN>Yi;cWh74!z&jm_PK$j2+F82QK9!px}FChhUc-TOxM z+SJ;D6%TPI%W{f;z5UV5KdxT|2S>tQM*ty(BY?GaocJ;rRkxlR3v{11s>5859fQQ= z2)%L20U4`e%ShZ^IN=PpWk`XB@_na}1|5ZOF96B5cNIi%!NtAbTd>KwHSD5ReLD1opH4no+Ea3p$K~ziU>sW~E z*|M*Kd9Hi5VC6N za@Ur!&&gOfCx^S$PIj1(h-vu8(Wdh`uPb))H7(ALtJY9qCZAAa=Ms3w}2O7DuQjmXL>ut;nvWqYvZ3HFL0%aUZ zFD9r^0@jMv3F-p4LyW2Emk;(f&gOVVnn^7H1_&|31MltGBE38@F-kH5=o|uRFwJ0$ z>F0Ku0XVle9z`fL!(QcyHeVw<|2UU;fKbKeN{r=ekc=bGq*y7#q*ko}tFKZD0PwQv z6lZr0-p`6GK6l_q@ycy|`PQuqbL2V%2T<|*)66@`bJGu7Cl2K?%^bFdV*OPFnMtSB zh}mc*cu-1qVKsMsRWe!4Q0!a{>wlOGkJhL%XCp+(8mBHjKcvIQx%14Q^uzMAznVt1S9%$hXk#=AZm=eMLA!VJAOvv_IKcQa`C>YF zZ<#N{IJ@qT#e2m@37?78Gv%A-1`euYFUwEy@NB+ZW@9_gF6H1If}gx`RJk2NC6tsS=`e;7h@K}DcY1K^|yy#_D7MRgoX4N{$b{_CML_>cLMwq zrOcN#lbE4=FCNG1N-kBM(1>>A&%I~LF~IQP%P{q7S|p6_c#hv>_i(s1c5E{^aC9j4 zBFKU}U=B7Z6~VpjOKRmv(XlP7K72Y?XI??dLaHWp|H4j|UQx}a2M*Ye*~73|c!Nd% z`Jh>>sn!WnmaUC_9N44M$HB8GxgVan3PrS@aTA~uIW2SMPgb3Ty)>9A-27;4;J7z2 zG82E}p;reJ81#jPM#W53GHeYRmc_b7o6~|jCSH9}W(=WHU}@84eJy;M0v3uxz2?cb zg`m>KiTq4qXjwOum8xZ+75o#z&34JF>9OgqiQ8xt)CN6XGO1}sDIH=jq~Y*wx~2DS zFhAx$QI3^T_+5m5Gy3Xyo#Od$nF{+VT1sHH^Psy|kFrL^?52S8TWwPRiu}61`#{3D zP72d;wPpvaF(JQfYllKB5)gKHbvfQjEyv# z@I~xK`-79wIUr@Cf^{QGg_a{d8xK{&@=REs^N@woT2LY62zaLc+%My2APa|CHX-Z?Qmqbb@5FcGzgVsf~)1M5^9&;HRy>y5W5C?&}CbHb%$z^GuhyV zrj<=jeqjsj&3H~vQEnLsS#GN{T45#9pR2@-HhPMPXQI@6tMz*+6_>ydVyT~u=LL+( zjS_jH#9FTW9dag$%sa~4yix+!oCm|&9bGcNsQkc_7FZa6!dSketw3B8Mnh#@&SN;1 z>spJVvJug4nx$qt!>)W-6lN2G?f4SH-b$=ApgB);3$*)`l5a%e>Gy7{9(S-E5F&uw>K)Fg=IFq|xUD5cuk(?^85mVD zxXj&qpa6Tfb3=sfECYO;oI>mlvH~g#=T08nNL-!kaKCRi_X^U@^_SOxfJ};}J*}e$ zB}X1alap5KVYHeYkwLP&d|59as{BYE3UgK1h-PamZIjy!=K)|*)&56+2FQHKPbkGN z$uA8s;5|(|IY_R|wg9v6*AcD1ES;FR* z^>Q;sBoXXqZh!9Bv{AdO{ACSJIf4fmdPU~x$^$#ydqba#Kr~$35k;k#eiudk91b(D z5$IC`Lofiq^b!ds`}!&0=`WC4%>{oHYgeiK4$K1`dHM0)bO_`)?_H0XMMc?;y~OEZ z=6G$XF9Ga%AWfl64IN!Z@vTjXg94ARP1n90AxGhJ=pueuMzNGoza#Ik4vOAX5NZKu zIguNGu8nd*gD=kH`8>L9HxHg})y}DIbR8M;#oV#DiEu8xMs6F5>&nh1LO5Pa4vv7h zgkEzwuq~Jo3GhGQ(Px|jZ-DJc_Z~|P&%LZ+{hH318q@g4fHmZg(Yrj+ct?Tb#z-Wa zBhojrc}orLog-g+#7w!P^-+0uH1d&vZhX6%c?~YPqbMpTR*E4|l;;Qo`mZXht~Cz! z-BycnyP@x#Eh<1K$yRqTaAw@lxs8sljJ+NGqyT2jThYgZYb>RKv}e<%N*i0iL~iCs z&nLF*iIu7#H}=Y<>bV~SBh?f+Je?WXGm|i1>iwviGc67bpp*9a?MqgTa&g9#cJf4!k)Qqy*%)Nb$#68?aIy6tQc9+>-w+&CeW$pxLK2{6MaokJ| z^0ES9CrvceUmaJ2#xcDr@Ks1d61v-&)Nv^C{sC7vQxJd>y^`C2?pcAm;zH|;X)Fea zXauHwq%l$8Iw%f~H2NC1-iM7%xB#a)brldfrsAjd6zXjzYD6A=%bPj4;ERXdmC%Bk zc|s@l4d(|ACgp#xmqoX+b8PuGw}d;*73;@S+S!fdi|PjDOvZDg_p7_n)T+@9-OjZB z%(9Qx%`v0>Ma+{DhYu_M`$b3o4u!Rj2HCR`4pMcSi;Z`%s{3Xs^8H>g-x^n0hJ}sX zGvF6$x){VBAdyh1Ts`0C6+b87P?P{%7?Ev3lT?-cr|^6b;|WO ztwtn`+aNK{ZHpu}n1i2Wo4_?D3!xv~oWjODkq_f!>lY86nfRCQ-+cA?KE4pFm{26d zFXhPdR9=^EW`1hZoj9%$6PATQ)%_DgcdLM%sdebcZxWe2E$tT8vg%8YW5S~kB!3m# zm#R>A30RN|9~~zl38$?-@%ox7w7T9_V)}pKL}I`yfhiG$C$Ap*`)B!IkulrSbFR(p z?eVu5fbP#T!Ah0c?;YohCU4OQI+T#qi4k-M$pP(L1}!b5C(7IgQZ<#nX zMZgKJfIabYlRMkvw_ByB{Iu81qs5(9Vw`&l*YxkE*QN#Y^ky^xfPK?NDe6wo!?3Ll zPoFtsbu1aJ1)zze0Vkd^^Mt~3+6=+&qQ>ZG&g?VnWtj3(|JQnlFKgU2ModJetO@g9 zw~tuVW{!}n&oxG}dw=PDivU$fQ&GZH5T0Z$5ui1V^?jVk^HCrPG!F4`^Ry(gAb_Zd z7vk^w)&9|T57y@v<|5oL#?MT%o zu#5cC9@w$3Rg~i3o6WZx^!Zsn>Ga!Gn~^;8#>X2v0N}HC4IRf3RlP)o#yDO1c<;b5 z)_*-l>`rsGE&Nqvxd<@YS8vkn?_*rsM-bb56Z4?O^~N?_E5@vZb<)xlcI4=k5bby{ z>dpOk!T~HY@Bn!f6eOXW+o$TQuX*>Uo?-lKS~6g1R22s{XDfBW>B zoc6WIG-g<6gckR&E`B)3_yOtAElQdbKPW33H&mbW(I5)K!Y``%s*$OrYSJ|d7V0tH zH1Gj?IQ0}c(HBooV10F8O3h}9%JZx(WxABlWIJ9vCWVD*_Ep?gt5gLvNpEwjBQvcd zXDjLv&o@_?eaKNG-1fux&m*wDZ$lhvLxW%0{p_npn(=2#F2BS2N7lta1mb(2V1ryl z7wyKy4MYSE0OW>F_U6->lN%%^kfzCbSmW)`^WMnvDtKsIXqSo(O2eW#4^e#`wjZKE z{g9>|pLrmPjw;E$kI4mbV`!>kAnBr}t7_@NhP-*&43Vsv8dCyY674p6czj=nZqKUMx6lgQ}q}i8kJdL$o1upEbz2=d|2K*F_C^7j5x82yb zD@w<9*1)eo8T*0?S&qh0Nr`fkeUw{zuXL;lVoBjG3_EDnVx*lU%X8M0Ylw3PfqMM& z+DE;vC+V6`xGrIX=l2BR{sv)x!7zz9JsJxPDAR}7(yoS|viHcB`PjcR7n{s4Pb$qt zxB(AE^dCUhzw_`}fyf>YRx{3j(Z<;h!kM0VucMp>rO=Mg>piVB}$X zZ&e6tpfCy61FQ*hP+0nHA}o-$wt8~}y7K;rk>(Joi{HU{p&dPW^4jZfFos>Xm>BvTzKv zqWQ2%imsI`;g}A(4MP`G1R8Kc8(5@8#T3OpTrk0pm(DV(XC&Gup8ruIKQ96NFN17i zrOIsIg)f3d`Y*KhTeNMY)6ON-_*;(qbr*Lj#kyrvVHL+T0lKo2yAzYliN?rXYz4$H zq{;UJ(ijNYWQMDJw#R3fc4rvmRHkadP&*oFuA2D-YL4)k(ZQtf(WLR@@@okb*7O8> z;m>gd){o?a0sTE=h z;;ca0jP71yZn_7K6AFN~K~?>`?^rAT@Pjq2sPx@m5*by5?%~VyZ~RVG#|vrSx=Fjz z!)(pBVNmkh=S7zj{#94a;T+_&9p4cJ?KZ?KK~3cFs(^|xy@FXOJ?-6l|_FR&{B6&#|izmNh|6u`hJ)CYS z9+Izp!I+(_#l3`zGGCtg+Y-2#?oK7U?2{7!2!f7qSy!4($uU^7a4^NW3?hmexN_urTAu>1a?W z-MVM<3^8WyH&>=vR5*j$rjt*1Sw^(*7b^j)nt@J(pp*Fe-W+1@6e70#vLKTWyj?{H zCi|}xdx8>i6Q=5X(`sGEbjSg*1~0=GgP`7x}m zL_mXLN!@3rv#y02Lka_HQc0=tWZo~sjkNBPtxw&8f1I_=X6?U7q=~WLiGR{zAR%xT zxuLt6VK}|JD%oIxBmn@@YHcBvpTrXTW6r%Q*_}xCCMKM}M3e7Nw2fx|**7IM%2Vx( z|IRjYFw@kZ!;!&+IgRG5iM8_ZV4YbIbgeyvbv>B1#3!;*FXZ>%)ayMqSNcGCZ+q#t zL$FR)yJa*OU|;;oPs`l6rLInPmWvUG0KVH-b5cVsSMl+3Yc0=(61#lo$-P9AUBkM? z7)7iUlwME&%_FiUgB>QYlybkE9cz3SVUW!B&ztqS(DY%7%bnRlzpnUIy|)iRyStj8 zojk<%*Zx7@ETyvk*4jL`|DaxGQG8b;+fGaY!me<5Mr>G|d+t61G}ocBvqiK0jjg{X zM(Pj`!me=e0EYa8L&eOX!j}LO!D+ntwqNJ}PF*`*+R)8w5%W}q0}l0Gl&mmE#Wffo zw#4->E$>uny12jRlxy@Ghes4)_)ia*MH~bzkKy=e^7`Fhi8IUGkM7MGHX(8V)fnAn z&v^}o;HqdSp4LfgAW?_|o?Tz@eeP8DX9h7}6s@?OuAF+7oHnuc;lozBt*c?hhtcE@ z5SGLxiR3E~+4tW6_@y!J&KN19gFvQKK(|nmH>kV;?zEwpGnn~X{8I)#q2cvqoLR@R z+SM((Sm|#qvS9_Ce&+=M^$_1)PCYKq@u%tZT+NZ%-LqJS>`n*#9@DK;MhvQ=Yab=; zSkjwvP-GM-xl~>*{6z$uO)7c1-u$s2 z7SlRJt7KakTF8%lg^9?*=T5)V`s}obZSh7tj2L^s1D4gE+M`HJCxkJTvzC}s{+Jh& z1kTgvG)5biIjRq}lR+Q!XMhtx9Epm62hzonWj#F}sl3PkQ12ayv@#e|qqZjtxT=Xa zZICRj^@jY2>)FGh28Cqo+aHXRH#1=&kd!k8!kPM)M|U&M0q_LBaY40as^U~TqYnVA zBuIrzw!HD6Z^>Wak8ai&pVE4NUvv>Qvp!6PZ`>Hc1G-^fR|m@j&PXoZav zlT~+eM@T7JUcwbQDdDP&9`{#_HQUO=!lq*Kr&tddQ97}0a_}v~ zT@O^t>XS@tG$!LTyYPd8W@i~s&H9XAW2N>_8F3!$fsYUT^ZK2gx26t)IzuEdc{Dj$ zv&B81D=&3^+tjmIPZQcEZy0O4vCzlMzTy56JHP6ILxkyOLp0cP8+(yld|>00{*_(4 z8%??G4|08U#S4-anOl%~g1iW)AW~TGAcF6jF%jr^Xki)lPqcBK4Q&#K{twpUM7FES z58>02cAO#Iszo9<)#=Di^$qV-KV1V%bkh&NVHK~@bB@YlPLGT{B_`D4z92ufBj zlMgqxh;F18;ixZjp)aLGlQk9JE<`})^o2I^J`}@g-je5wOB%|GkjoOa0;_+Yz{UJe zHx?>(N=AMbT38r)xv2$&cz?1~g-}0EY4#r01I`~cMjNgE|7Phps6J_zuknO~IpXY+ zF-c>fgcU`Rd-;tv&z3O97Z_vV#B;zsSPRcef{e-Y;7u=0-|hP<;pUy{h34`_1;OCU zU)#z6-iO7$*Nom*Ymd3+@^9mYY4<*GibUcg%}nS z?(v~bG=7A@R*@WiiZM&OTaM)T0V0VRS7$W&`fWz;ID~`PwV!RBSg>h8>G0C%Dj9cR zPVo_5js#qRMr{Rc1;enTAUyj${GkHzcl(s7r;^xT>cyd7xeILqNRxp`-vw{FXB#iN z@0LLtNX^CCNT|Ljpv#Eq^HM%WEQw0i)yM!3q(-8a4J@*isbp)nr9Zc%uf@fN3(9@a z4hhva{4cwW=ou#^e@1jQr^L&B95QZE(~ngGFM|tv@LoWmCMB4S$>|;Z3c_G25%v~g zHzBN1N*-PS=Wgit3h+R-sUYvO2Sv-B(ZElfJ z3grn6!0Ny|qRcDL`fBV-%Uv=kIHgPGGBiyoU6+8$p`!kT@|Tp2N0$!qcdJ_8?SqNJ zvSao??ug9_C95r>4j|ypN5yo3icuj-%E$J8fdIV=VQO(}PxoYg^B+vOGvh$>Xb#EU zD_{zO2cxiYJF?yFh}Rb zm4z^_8c`07yE5TpZmwg>bg}7mPTA1T#^6NL=P7ak2V>Z>4`DNk*<7Z_a;O28m0%BM z)M_sK*C+Nn6VQYh0E^p+>*peo!;Aai#>!Da(55=e7Y_(Dh*OO2WBuKdg}sRj&DzES zWrHA*nit|c=U;xbHtC>8fFX!>V}AQ^mlCX3CJ1c;=d8i zWw5as^Eus@FZsNh5ob5#MHIwK0IVlb2LWTNAAUp30yE2?sS8Y$KP=`(+2I#KFM_ehFQTf%Ant}++8POE+>mNngwPjGlDkd7PwldvSw#!V-ipRi!!$QjqlIlrw&-5P zJ3i0X_O|82n4Nmzcxh(u7cWe|{PYO|E={BVg`0NY{=!Y!c$Y?)=^qc$5TS5{Duz}pbZ`=^8XLp|r<^#Jr?!paq3+Zg?o^*543aqcIz4geB^qJZ&VO9-IxaC)l z<}xhU2qA(UEByP7>@xtHa1u*FX)<@b%-v9Lf^qJQejfYBpFLQ|=tt50$u3}6E4iVj z#r@lnq&bkq7xud~vq}C1@*;3b7If#npz@Tk^+5i?BCEWu@NgiA#%J7H}3 ztA_j6wFM4^(UDX$Lo2YLtxZSWDiaNDd*CY|Wu{DkH2suu=O<0hY<7(<^%&?TlOu5lwv_Dt?I;ul_G>Cx4%E)`%MDqozekTU zB%;LDZQeM|hTENc%oGlbw`o0Ui&xgP43hVKIgd@{Aph{SeGMP3&mCEh8RI&GVI8$= zSS*Kwz5U}3BoruaC|o-7%#ksv<9`AWGZRO&_Z+jQ~rk_GJQmB+QKZAex` zFDX^oi{Bh^sN+db|J0eBBgk_-cT5r{>m*r$ns(P@{+xoFJ#B>%XBLGQ))!N*dwrcL zZ-h0#gW9oKbN zP3xf7x&IY+}m8hcpydQp8$^B*6~ zUrBV*Ok~oD-J)mn8GhNE&vWyk-Ea#9wswS3|+xVczyA;R6lMi zMiw)^%HD|{EcOCJwmtl8rd;t~8&=f?eELW)+;CVhCm4XWp?R|fx#0j(uVty$S`Xhv z0=?8Vc#wZDvVLoakwEaPk5J#Gi}-KN6zJcBEqei6(5;zwZ!PV={+r0vK8`X7=LpM7 zNK0el#6fAbg63SsFXACvD4LO=EF!)&!UoPAcA62lSsknaBc{jknAAUKY_0jUN;RK% zpZ9Yc@c#*_#)qnf*TzGg<&?}R&-%au{~Zek&PbSKu(#+CNDB~!SsTu_Vgaf(hmlt1 zVr5}?txbkc$}GbxhZvGGMk$~UPjrqKwm~CLEFT?=d`nhwS%%FWU*l3yYtQN0?J@Vv zmfD$24{k~v?2=gU9Lvhan@VPYm*etY7TvMiP;?bNFt3I$zHw{ds;nZdaP*wZ=-)hL znO#`>rk08hjXc(G+C>Gwv5jP(HB+yvBo{875jW3&P9Ac<7yZe4m|T;s8GZ2px~E6h zj>z+fizV--XQDjO5&~qSkYpNV!{?k~uvdCDO4hAb&ki@%Zhet#7EtAvjc7;4O|9o# z5qphyzbU@8e;@t$hc-+`dXECeK>ksyqRcX-$7o|JY50sjNO%IK9*#AUSUjN`+4CWgt zFDl)|&IOF~loB(uTc4)crlrrF;j{dDlR~VYtSj)AAIo%8rQQSk!7RiHx&LmjjQ?Dt zjOeYBQ|TRI-ZE-*0^{qpq5Fw3`Bov}^X9enujr!kC}$lWp#8l;(*%iejC&DR&cwk$ z_0o?D1NUGsz`20Tx9au&;-XdPN%pLjA76^&OaOtVeA>jrx7QLh8_56Vid)DI0-N}( z%qD}*!Vj(4hWP1($40L{-^W-ACzS3?(&Jb33(&=hl>>OM3;YQ|CTXQEaO^6)P$+5R z+V$(->C*z$|8gG`f2R3E{RnhCet7gSBit|$ezKbd2$HSyS*t!T`wFYI#oWJXV1fnm zS?h9AnUTqWU=z!{9VN~!erE{o9jz(?zGrHq#vrPe!H!E?JR`jYn7L9rvySM5e$6%%108jR zSg~#;3R3VYrj(A+$hgcu032o}hDL;iEj&Nog6*QUjEUJI+9ZL&xSS1YFap$Nj;7u> zT_B^oYjmL9@3i}8Sg*ntULNGYHoi$y$|U`bHzq>lM1UWsYW)$mkxlBuMV0`nG4;4J zuGzNa2E}JjwTEp7vtz{0_x}bukNd&J<&qvwvKQJdMiz80HS0GyVvbJRE|yuE^iNH6hH(|7=BqX^XbfBWQM zU;wK$rg0-UcQZ}Jy+p9jStGX-`iSglLvsCQ2Q49D`-k^>Oa_cZGb48oG{rNcUEiUZ zVZy)+n+!oFzj}Rig@Dowd5=K1F6C1n@P|HSnBLRSp=4wCxg~FG4;On|Dd(|#LW0HK zVs$Sk9#EDOAA0%R>INv!-uY&5knDIK360;^my@?t*R@^iYpPtbez_e##VA8kL`l#k zLaCxOW7h}HzBiG#%jL6jI{tlIMCqHWw=%kdKN?$!z@eLf+6Z+iOW6G@l9{(G&*Z60o;DuiMF(KjXRjd#1S7R{Wc zUPfjl!zwTJ(metL3uF({gjjY4m6o3bDu=lh_iE4o3D6p0?f%ng88YX_NO~s-abal;&Gnx*q+NsvhLdn;>ymuKu0{DwMaHtjkeDR2-Y+V zO1yvEpObJq+1e3)+{hTT1sbnzg5#KUJd6FaXvR($rZgL;Z9==U=8-qNCf(=fMDhyG zXjf^pN=$M)+5rY6DS}86Bppf#%SCYbRZj%k>e~^OwBPpaP?*h&2BM_j7N6=k>ZHwc z<6Mi{@O*iN{U=-|f=rUu+wTP2SW+WiWEy;}ZY#6k`PIXm#xx#e5KTRO3@W5!LiAk3 z9>Lqw@?SfoczJaK0kd2uaAp zFbDbTB~Rt*)k=5A$9uPlc!Gmon!A+u8M}xsvN8ObiQ!S<0RTmtqk8ZEQ`=ic#nEkT zyNzprAc5cz2ol^~LvU}jad&qo2@pI$a0>~N#@!kV1PD%m#u|5bhlbP7-uv0-+xz|V zjx)~3uO2 zmRqcTV;GyJ2ZiK^xpnY4@h};tPJW=-%S$)toi-9rn{A|beEzYy)r~4EP?Y_U`bqi*`N78|Zl&Z4W^l@|?rpFqp_0jA-CIof ziLqzU*P3P%`#nSN*e*I|9^AYAx&AFKZh$MU}zsHrub;53ICcIMQy z?{d*Eqg`N4M_;y>@uZ3UKIFKzWInz#U3)n=9gHV={VcBTLAMed>cSn$yZ()K%Y|?7 z6&XT1e7C1g1EF4y1N&%>MuR|W(Pu^E4WY^Nte1Z^IoT#Vz&AH0?f@x7w`kRc2KKdK zn>F>l^o;?T(*6nR==kznIrr33Zyo7kRMAAmxhUq)mfJ~Hw3l78^-?J`;^@s^nQQQ_rutJXuc20jI-}>yrQ`e8YCFgB zZGO2N4Eg|=7D#9Jt4c00>P*M|4N{P+%7v;0w+hZFE1y?uPWN$O!);i~x< zM%$qrF|b?RdcS^KlJJd5e=D{VO0;!)TR!RvA2IV=Qtk5q(FIAYX_j4PD7?>&!V$~IcRajVR>2^4XDlmAE?6h3PcAlmmC(BrVxPOUzv z)c)OYWgXF_i9ZcB47`-Y3au14y}2c;yP5YZ_1%NM3*@TB3RO_B)}k!RwYd(VLh2fG z?R0d00?vOm7ZXbl{wkf7lJP`KrHUfs`i6r#%R+?LBXtfVLR%+i&=S9?V(BRob7NkpWM)`Nt+j__JH0 znfWxLcrR+;av`eCEdqqN8Ih7Mj0xNGRHze99ng({9%;n-VRx@AMmB{B`lp?e>h!wq;QO zqUPwlIr-~6S>49wxp~f}52$`+QUrz7AGq)}&ZJ$-wXFE?^c+hwCw%gXXkBynVJ3@A-0W0z!_w#!V9VHp5 zPai$Xcfl3_`1=Al>%KS`IDlWQuCIkh%NAHx7*_~bLF>gsO2n$?XS%o*sHbM`n7|(t z@Aybt^j80IjTbLiRsH!+Z@z=(7@*08S6%gB4Wr@W=DEAU9i2CqjSk4Yqr4@E&^`39 zP;hKSf2~pQOHJVUl$!2+mgUDWSexG6qh#%~lXKXy!^6{kM&6et0ouW=TI5p;|DkPy zAL~A+&M8VBx)5=$aO~bm3ze#Tz72Jv?lET@->pARm)Xf)#Ti72p+4nv!-p)VbG|r} zCb!OL6EwBY3A==bjvK$r&zv;|>IL|EBd>?>htk%G_BvTT%10du)A+t4O5|i1&R%(! zl}lRsMVrZz&SHoPiWotVXm*SSUct8pMlkmfPmmUI#I3z(Zz0TY^>cYS#oSqk_>L>T z3+b}JuJccaT$cRT$~Ajm#EjLJn`ab!52@Nu5jAZ5u_qCPYfiM}O|diY)4bak$Vr** z4uAee%qMU?nWYhOY8$r_2UG^~S&jUxL~=!rwzZ-8z|?l@^UL%!CIN$ev*X6hp7PV8 zceVlyujSm?chJJXJyQPgSP3{EL{MLnwerukU3{3b7JmR#$@#@C7Il`hgDK&Ml?=$1 zL}!yos_V7V+`9YOkLq_lUiyoHoKe@yYRbK-E}L$}Z)%8Liq&W{8Cv5jMNZq|iaj!C zgWfhDV;&K61@Ja8^(V$S@&Tlt-il>>DrxzoyyZTmpj?SgwXI{qQ-~pHtK_bujq1TcUvXtpmR39}cy_B8$hb)&a=-*+;OC9h%z7 zvFEf++xI!~ORk7FU-TE89fD7f^Wc|3j

96NAk9^vJi24f_#EzNph9moqn z7@|y#cT+XcI8eVjor!Yi0}CF!arTo)#qPSgQ7Yg0vFX$8$<7knx#?5 zNQ*vrezL_+#N+M0DF^NvEl)`v=_rlVd=`J$sVA`yTG z?|${UZ?_@RiSTRGU%+O6BpwaAX@0sx`*|Gnz{vDqDt(e!%L5saPa%noKYNq!GhgZ; zSJ&HvD=#wRP!3e~j#q5I-~I8~s@{KpVNC0pF~uH!k>$I|h#p^imj#I>_8g*p(Wt2V z?1LXB_I3b(?s2o5!>PsT4&rzQi`H+8_bBwv?{))i(;JVM*&Z&mHF3!=QNT^D5ZGg( z;UA~l^?unTs6&xl3haBq^A|W#qR8U9h1dNtoGqbVUKy+9eLsJeBahAuwKVq0Z8pnR z9@D_RGByu&!9nIfjiKMCuOyE;L!{g0Z*PX8$?9RgQm>PFIy7NL z$Z@d~(w>y6r0NpH+U2@$pbZ#CZLVW}eoGpdYWj!^qt<5to@%_!T{D*s;wS$hc-Pg; zL{j=aOkeEQEn_wAUCW*uQJi94L*?T)tPlesk$LsI`_zeY4CGmdGXCciy*=PqDxOS2pT|yp*m70$!batubqk!?{!K7n`bES!hspFFuWATdeGTbCCIhUprKo z1ISr7EKsHxv2L){#{0U;Q$aTz>U8TBKff)KKS=Wk!p+!bil^%e_PFQwP4JpA72nH7 zIz3tM|ITL1uatUgEUhdZxW7r=-S-%kND~YCQoHjOFB}_?urAb9Z^}7+QSEm#searT zgaQUqsIBggQ0l%G7^dQls-dR>-gQ{5?)+em9J!M&5=3{SW}YKE)`q0xdyZT8TA6xY z1RM6SgZFIv`(uC4w4PZlS#Y%A06N~fdb2K5Ja3XQ{Juo-;ZJEp-@}#74K!Zy(@-Wy zFCn0d=Ir*^i6_*rnJByxcs#;+EiUht9_GH8>~HiG^1+d*RbU_DtdY^st)MIB>Vp@1 zpB<;msdKOGdgGn3<9mAPgmiQ= z%$)-W2Wwdu`*H&71GxpQKf~tS?5OrJHWA(l42lSUB!y(uu+`ftLqCua4x+Cf zqZV>e{rya2N{#(2Fbwex(b8|L-e+lUqJuj*Z-7QBa{5^|mfxC>c=^s7eQ29iH8Jak z8!&0xQL*Z;eyldQXiK-IU?9z+h{}9705Un_9B8-mDh;=W#ITD zw2Zt}koYH4lcjVdR$sFF3$dgTAlq-Q)ds<~v55xmuq78}6`qt8vMj7B=c+nGJ%NSF zt%gaAYL!?sp@brPf!f@~xiKx1E%9bqKc-_{q&jMLhA1 z>o9L%TFE&bzl7eRAY%~|QNGwG;Fn+Y>?wQ-gc5G3u z>M2a%08m$Rt~<$^o=bf<}Y8jrN!MknF4bzuP;&M?e;JceT3@x zqlgT&PFteyete~uHa!SVN%bk#+E7zFu*T3+^? z>>~o3&+tWOt_jX0ViG8n2$ex|Y*Whk0&}C38Qv2sYW;l6dZZl+G6I*C%>jeb(?7<4 z%Jf#UZ@j$!wZT6+;J^rykhs@AjOtBMYs8K<*ogfh6stq`{8HU(p zY`cMFJA=m8_STXl$^#hw!uhHGe z8_pnTX3u5x$RQ%IJ*IQt$#M5h@KGp64|M56e>#7)vTRd7WVQrw5&QpoCwym8v6>9L z^ie)%+DhVlZ8}1~Ebcp^esUgArhNN__O*S{Yeg;DZ7uL8QeDDzcH4kd0H?ZG`_CH0 zHR>|}X{-8;V;)g*9U1W??l0>t@_dKHR6@|vGUC}lNwhtYGZWc4>`my}oYz?&LYgGe zGDs{!@{dnN_FGnN4?d2X-1kNH?2=v)35?$>)`Q+{`sXF~eM6ReUnE2=XD`C#`j8&V z&;yF#0>tUe*fjUw44rU?%Id~_)Ju|o%;?dVAEx+qYox*z_I$SU#{KYHqzj_+0P67A zdj`zrd1kRrDQ#n_xetamWsO2<*hV&W*?OLG%t=yGCY$?qA@GBEj|q8F!`5sA5*5;&5AS z2%Y@6(S`Z=6*VX8914o;w#tiw>7rZ}wt`0(3rGGS!VQL#-;T~vcEqS~;@7sZHakS5 z!+$?%=2})GMEvbV7zO}yu&)j(}1~ac-|SjW#;f2ksPs34@u$#NOf+CX`mzSc#Z>u z`j~HO``-E50pQesg@*Se!)&iM-HY(!WXOV8b5m=Yy6dNCpAHGkhyCBXuVl7S`9*&^ zwx`jyr8m$iAUjpBO22Bh>{=M3KOg4^yaU0O8SP?JaFcdb8EdCw!RNk)DHp+3S0?TpdfT z7*KVM&YFzq*vnk|?f1xsfZSykoA;yg_HNtyPj0w0=Yp+g<7Gb{GyM9EH}D$Bn>v81 zloWf@W6!Gm{A!x13`M>mj~{u`4!97jS;!VK4H?^49l_WZ9*p2ILq`mRX0-wKHZ?O{AGR~cnIq~ZPIH=KY z7K`02^wb*JTD4PqpygS*?OovqkR91T&!9RpXDJ0juwXL z{9>}r_H@|3+z z*D8V*i>oD6ua=2;EHE{4Dt3e3w^CK_!v@{`c&@1m0MK&w?H1?QuzitvXE(5`M~yON zyM1}pm!vtP#4(Nbi{|gbd3t0CziW3boYzRZ zq_(stUuXUi_tIz%l24BHp!G&C)vFOcO`35xHFqqUV})1W%XUb>kem~|D7x0+u{5g^ zp5?SRP~D0@4MO3a)0UUg%NB@7oh#(7De7hF1QW@1ZhrXQ_qHM9jMi^z$TDIoDF8Ed z%4-VkxG~G!7t&*zQ{ zF#rIw_*vut01?T9A;hQn&hnu`y~Lw3bxfV8wRBM|kPy&!K0oWW?{g5y_eC`M>fXt? zDIKr$rwnkR^h_=LVNRD!VRJmzHA72FY*DesP(L zcuyMz z?k;u8=z7G^%2`|s!&o40IzDAw@w^lU4J3f>ul32btSn3Q)_#It!+0lm(q^o%rzRfQ zsIQG>%J0HC2!d@BvyDV5-a?d0mhTKA=}>Qaq5bsWovH>pSN z>m!x5E^9(SlUw2z?uPio#`s4SE}QBNkyG^3P2W?BH@sx$P^#|v@fG6|kWf&iyS+NP zbLN%9chmfj1{KaHTh*CbXTF+oHu}c#Lm7f_(EtogZjBQ^hAcVmX7`(`sy|zPlL-UV zc~@t1Zq(i0G0{HAJkYe5V~0g!A21nEdsgZBv}=T9jT^?RnNnPhCNTP2sJreX|7>2N z;42lk6rtMBeYZb(&``gO;ZXL6!T~;NzkA^u*x@}U>;IGTg5Ods;-oLqw1P%YG|PNv z(7;_V6i)h4v0H18X~Mu%5Lb2AA+2BD-zeeRtNk2kvRYuPxt%zeZGeaq%_QlvrvO~y-O$Km6T&L<*zn<-!w@`TY#&CSgl~v_RjmZ=@lpc~gT3R`ajSAg zl^Wf5#)*b?o09?Rh#l#r8tSfG#*ZAwRX^v+P90*?Mtor>YqnrHVcq7YrYndZD{q@! zT=UDLD$Vn(ZN|+%@#k*=*k$oIipc4tQl6jvt_S7qhaND8x`4UZqOIRFq_ZGo=u2*0 z3X)ymA6(hvp%_ICiNT63Q@gEdu^Oai=dG2^b{` zmqzgw;zp5VYszh>B#!M{r(I{%AbR*lK0{)@HigQFl^JpGu9mM*Y7m^deEjPS)Z92B zzl%g&(uH!92Dg>yj0Q&pZtTRveQ6PTsJB^wN!x~?w#6FF{abgDD-obzP`5+E<-1=_ zZEQMAPw#F_dzZ^QMP~YrKr2YIRvgYcg^N#_1R-i>ri3B@MADX8SwD202J}mrBk2>Y z;&c}IYgj^ibR%nOTZ_N`f*H|m@aIzK!|lhDnjoIK5b<5^=!FDEsB&NfR-4~|>y{QJ z)=CgDi85(lGQ%NUgf1vNqq&pnHPYs>Oys(IiVBTN|`YNQeBx zk-xUg4v8$ZBzTsQFl{v@s+S&zR*Q$*eGKOA9D3cz&RXPPf1Gm?h03wA3s3DnjxZTI z`~VaU?!3o9{8y%l?54$4ufvO1YmbeOOl!6OeZ1)E$U?CuxO2HKm~K^-Cx8Pq9Up(PEOwu`{8)ES0RXI?qTPgU z+WHnsGKB3m7`Xt`t~$~&O=(|X`{@e4<=)Q>wP%W-NPMPFo2Al`*XZmRFvLNd{`rw7 z_|P1_N$$#EOn|7puGgy*fBZ~qL%#%a5o?{Ep?vial7n&?Vmg;%e!7T92OYX?RlPy! zwz>0=eLfUnQqLCRb7Yc$|6DdEduF%5IC^e&F73LM=}=?IyOZ#x%HcL9IH3Bz?$Cb# zs|8-MV*E@U_5C>O@w0aVBr)5yj)FtQADzq%+lP7BIt>&?T=?8$71K|SsG)h~)evj-lZ+Z|thUukU z6{IK2BxDD zN3Hgg5B8myZ&Pl8amax5a6&*>{ORNQPbjbU(I0Xb#Y>*E#OqNkNm6_?OfvvTcluen2NnZv0W}J&m}ar7XhPlsC51)A4S3tqlGE zkh%WGkH6G}C6U@wmGc+k^(rY5^ZaTF{#D|@Z%Q-wQIdFU^Ay(X8q28cZ%?d0R!n{I zM%wh5%fD@kY|)!^>HmqN$NvK!|1W@T^XEY1KDZ5c_Wb;yZd9UiY7`F#wnZga(udzD zUbMGjxMD=aMYL1KaqCxiguDFhprS)rd5|tiXNEa{osLuD(`Zv0#Ggh>zlzPK@bO~k zOC)uQyC#8W2|2*7WUit+0?jY@dF#&#Z6n6>vdW7HRna1L&Argu_j=5mz(Mo4oU5WZ z{iEP%zX%pII)Kq{aWup4S~NA;_q|5%jq`5AFo0ZnvnxL^Xl#v%8*57v>j61eN8Imk zWhkQkPF8KNZts$tb@t%r=uDh%7?$2ZhK10$jQ+iikRis1^w){$|@|FNGtg7C6Tmy>ct9f3^RfcvL4VFC}3tZ5JJ-k zL1rgZ#D^y~zNVThL?VMJ>cB4nmj_f16Vs2n3v(=#kcp-+>?-FVmzNn@1jt6egQ?zC zu|i=Vl2mVGPk}a$SE!aXPV*1nhJ|-X} z|HQ$}UpUemMtZ=CIMG zMEja+bG~<{XdZ8eKwf{-xmc>}Y-_ME0?T3LJabzILCpEjP1e`mc8ZhDtx|p|&{5G+GzpH(MVr*D zDd4-tZEL>NpX2`ZB$2$=;b{X|35VkSZo9%XQ1QnH$VXf=cTvy}PF5*O# z=UgedGO8aj5Phyn&hz9Ep#!h%QY-o(p0_gRpy{8*5jp=8AB{( z4`*?)gYHpA%aV7yTtl!5Eq|Y=PxS4QxTQ1QPp9cU z6~CufIiF0fiNX)_Ls(q6%sIGTmWlwv3V!DwsCz6U>f4!WHkWPhNqhH3VLYc3TP=jBMpH~KmX>;OqE}o+EQGv%RqVz$O2x=$a&Tk&Tk-kO>Y~0v90sQglUx z>MZ7ZzW2ZdO>UdLO8+<>hX~K(5g>y7ag&+kqkX4I`L6ltNlE^a^DVj-SfH(=YW$MV zxdEDmxx2O+GEoIBnl1;ADit-3924W?td;$dYN$$;>+_KaS@4(p$M|J^1Tg1{7bg5` z+-_XC&GPd3To%r)|Bb0WK*3+gZD=o#sxuPe@As@Od(-(T{!M#4=7`txfIkwDElxLj z%p-ZpH%obpowwb#divoroQV0g&MCb5g#CW(OX?gRP*s;rV33ouyCeo!4)*fs^lPqD z`vI5S+C~s7Wh!+ZUoRkWPe41faYxF3Vy4mA%Wm;%e;T9T4!{K}W#7I5&tE3{XMADq znj%6`epe?uT(9EBlu{GWntZ|&*3>s*5Uc*)%voSExe^H;zORK<6TP?1^{i0QcV)rW z51v`Alb6lyjwZxQY{40~_L4`hOirqVC&cZZ2Z&H=GaFI7DVet~n2PYb+S%cvV1gBO zg9R=uRh;cCN70Fxje#jZ$uFB{$BO=d2!2+?bG!!Asf5U4FY=LUg_oi$ddj zK8>wFc0dtKP9?(}G?Rl^Xke`20&xd*8rttj!&4SE)< z)y+My!*vQ?f^C*T{UkirVAEQ}9*BEv;9n=sD{O{@1^Vu%DtXHCIo`a!&-!jWs_giM zHTcP9wIn~rV*Cej?^3 zvPhD!$5ex|r+g>xnXKcgK_fr4AIm@$pU1dw6-M1M9nJb0?AX?Q$ zytL@k}qoCXIPE6fKX`P4|K0SzUbE=?qOUzcsn@^^+Ep!U?TvS`TcbD zv7!RRby(c#&A7AAZ8c6J2pd+P7VLdu^F!c&vmRssLC0)1|Fm*4UsGlbp%UmN#HblV z;J63dJs}2Su{$c{pI7PaPnP#o8qw6-z$J^IbBr2F5Xp`ToVEo8XE(MUk7(3mBp>62 z75&I~hIKkJut;;^_su5LBfLucy`xF}1Q^7RCFUFRpk;#^j9}!`^J8}D*zw8LFEU7J zo;N^y#9M=C`-@_G#5q%Q*DVvy2xzhM69WyXVo*hS=Xmm%`un=@iXX3(SAbu4)i3WY zg?#-ZtoNfiBc_^fr0=c!qV2GJ-cXazK>)-3Yu}9J1Vm9`)Xcg$Nc*zPfepR91*V1J zZXhX;Ot>yl5gd%ZCMNgtjqRd6kl2z@?>O&M2KiUuZd*E?Y%vF&c(-56@_vva$66E(1d} zW?#j5Y&rFZ2ic6XZ)9RylfyL#0!op(b+}tg=kn15LGiu!Qd3!buO@qH&-MIYS#W!- zv;UXG|9cQP4(G#i=t!VfKxU%=c#Sa3o>2|bG{<6tWICqbY%m-o<&J5|K+sVPcC z#2kegv-MJw3Pl(ue7~^EL^RDpKhc_8+l<8_K$pFqcqC^Q(0GV5cdpbr67o`F%k_6m z(h2L?ZyJciR>rHIE8ztW7l*rF4_+t1_h+5XFg$}Yn#p99uyD^2)WO|uB)=89k$u0* zMQr!zm@-{oj>A!*TXY03RzvT1ZQ^)>H6ErHqjfDzOl}t_en$0c&$~5M%$OHwE_@|; zXR4?j`o~M3Ghh89oOm1U`YZgZlKbu*o0c6eVjBIEs2Gp^i>R!BGY8W-5>O6dyUjW7 z3(Z)CP)Yl7no560oi#(rc!iQthBA=-Di6Hd)pj~&O0dK_+~~^zhgi;>YthaqZRR!3NL~;2_K5_@OIvv-|DlwREVM zm46aee5Q7b&6tiG^d8L_*Q%=e%12vogQ@n36zG&m7|kt zyTvlw@76|=v@>AprJ}#9$y_fDB?slgMBnJheV5G93Xt4iJ_pg~%{0jN=^13oc(-#L zElsHC)lAEfsgibRZ@p<*J?*1Qpb6>rSGgT5&zJ1x4LEZEfC&eAT2@RS2;0qK#b)o( zfyQuwn_9%Ty+(^gw<6w%o3wbqzUrdgE085WMTD}Lxj1OdlC$RjMGdMb&AFtzi_AH{ zB9+wBAQL8wO$M{eT@d#_b&&`ou;%}vscV~=@VGUcKS$h40?4jL$68RTy4OR_XCy`< zn7{UjL7y5BLFV@YAVqV*uB*Ro#|cn5teN~FGZB(su`eJluStFEFkM^4Q(5dFb+1R` zqrx56KQ(oG;9iQyXNEj;Wyj5FKQ3>%w-?OJsmK$u{1)VtosGv?Y72)7|5y@szETmP zgeh3ZMlclRcvrzWeg>;~f~m`wsqJGcD4IHNR(H}RxElVfb=q#GEcM!_lpX(5D<|Z$ z2CUwYD<>hU+m2hf^P{mtDvU+7;oKpctJV^dvSjl+eP)U^xEZg8AYLp#C{Un4ik%h9 z;8D`ib`iuy`YLl2hrK;<6qDkL)O#bA=JNdF3@llXW3--=u(0q-^*JimN{y%|Nmr6ui~?eQGO>UvX(QlFyi2>}NK#{3X=@7XJ_$Lpllc^gDb z(F}!E?#0@6T&R^Dg3iS$*1;iV)4G{Mq69f(LmH!Muvh9_wT-DP#B#dMjrF2x&kC6E z5RVj;NcpV|F;mp!kp%;_Huph%SpU?b4dr=pjqTGYShMwg1KQf7&fW{}IQIEr1FSM| zGEh?2gvkM93FoCKDVw(WTblnV-HTee3v^Idj}9>%7P##6#GWlJ?d6UF8iNdv?IQ~= zOSOiu+d5ht#oF@BFiMzggBQ6XofREq`F@&aFKgBaiq*gAuS@qTd~iYJ5D8G*BGQ4H zm5P>{+K7i6xeN_WCo5P8EE_bF)JR6SE;`CHP&XkaXNU<99^Ge9Vc@vGzB{EsZu=pd zlTi_$`_EK?i}(YFEi2)6x$dQtP@Y;vNFBIY{Gial8ULBAUY3^UMj{Sd*ni65haN9X z@Uia9zEaf9|7lx!DhxSW)bB?c==HA+G&}}P?&?Es8Z1Y#FV6Pg>wyumXG3Oqd|`II za(2t#I9Dl1vdC4R08GV_81*;i$e~Ez3f8A{(X6qv>Yp%L`?bTbE;<$<*R-(NLqQSJ z5Mq?O8C|#L(((69N@Mqp3M^!au@?V+<*z>35CZX;H}(okZEo+?2kXv%{2Vh$G*rvx zD3;fXUICR9b$0ZtqYNO=(c1B5xPJF_!*J8WPQUNuo0cB4dG0GDn>Q^<2lWY_s$0JQ zpcoBe>rx`MqXz7|^(6=)J!LRitR>CGxRv_wI(**YBGRza(@+Gy*jUn} zv)edjKJ?dilMN<14w>OMmspYK#JxlP->rO2mh9ymvOkjQGAYaqMxRa{pP6+ecnWhK z1DzF_8uDz&`l^}srS4g}#6INlFBsnTCaoR@*SzM(^BKWf#W}GM7(fpDPc>I=+cc`c z()C+~5~HgN^$S6=lSrX7F4={H2DY)=QJqH*!DK;tn{{jO*`r|h6YHZ59NHq#2+&1; z5y0MruXT6O~!(MqZ-Ay%l1wP*RfFrnbrk|Gn4ui2)DWo zH*Hwnjzw)8Y3ImjQl2&G-pwruD6~Bm zE)Wl`!G}bI3@raX#6slh9zrEknttw`eS-0Eq+SXo4(SsqQlAs`!85j#sAOU8HMAz2 zZ2<~j`z4GQYY182dDSS(GAFL#$YAJ-(PFr6G0L}Ms4n_JLILXV7$kF}FOg|r3s^BX zHp^5NF>G9*Y8IU&eyL`&Ha~D`f=DQ~5WBW`)O_+-h+GkHfH=H`=~NvDJF6WS=wDNNVY$^W!AHzX%KHty+3wVgM7 z{5G=p!Dq8Dq}nkM`H%i=NxU8p%KxAb>E{*aen|hLT!}r(6qX6Gjy$I)w+&6l=1<3p z93qY&x}M|*o80`YH%0w65XAcK=cUujP7^$eb@=v&GN$*!d8CT5_b{yrUBpksAH%Ba zi24x|wB_jz(V3nGg14i|vI%@y3uW`YR(5TDM7Xs9Y$R`rnIt!kgK+QRDybe@U)YWA zRVzC!7C1VbxsKJeZbY{+=`J+XB_q^Q&tN=-l2-YTDPPk<y2-MR|{hN+K80Y`ClKdf6`x|A}U{~uIrOm6@H diff --git a/writeups/owasp_in_sdlc/images/SDLC_in_OWASP_links.html b/writeups/owasp_in_sdlc/images/SDLC_in_OWASP_links.html deleted file mode 100644 index e944618fd..000000000 --- a/writeups/owasp_in_sdlc/images/SDLC_in_OWASP_links.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - -Application Security Wayfinder - - -

- - - diff --git a/writeups/owasp_in_sdlc/images/defectdojo.png b/writeups/owasp_in_sdlc/images/defectdojo.png deleted file mode 100644 index 095bd266591258937bc6488f4bf68a61aa7f5854..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 359906 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

X_jJ%3` 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

?e!5f@4QZggA98$l<#QoZ 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

e*vB3KJC|x;;iEB? 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%0AR0!S3o^v7xvq^3if9%tYQ8B(7t7u-^ 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 M5h>w9LCsJ92PYAvhX4Qo diff --git a/writeups/owasp_in_sdlc/images/samm_release.png b/writeups/owasp_in_sdlc/images/samm_release.png deleted file mode 100644 index bc4105aba7ba4f92a683819aacbd66f12f4ffb23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46503 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%0A!;}4?tj80hbSC4+gOKzjeds;UssF* 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 E0l7pQ$p8QV diff --git a/writeups/owasp_in_sdlc/images/samm_testing.png b/writeups/owasp_in_sdlc/images/samm_testing.png deleted file mode 100644 index 29098955ba8a1c532c5d1b099f18da1612d2de41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48288 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 rVJSE}=3 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

+j4|;lfT3B2} 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 z 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 diff --git a/writeups/owasp_in_sdlc/images/summary.png b/writeups/owasp_in_sdlc/images/summary.png deleted file mode 100644 index 7f1628a6a17b93aaf823036d3682c34a3bdd3eab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78321 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 z --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 Note: _A threat model can be as simple as a data flow diagram with attack vectors on every flow and asset and equivalent remediations. An example can be found below._ - -![Threat Model](images/threat_model.png "Threat Model") - -Last, if the organisation maps Features to Epics, the Security Knowledge Framework (SKF) can be used to facilitate this process by leveraging it's questionnaire function. - -![SKF](images/skf_qs.png "SKF") - -This practice has the side effect that it trains non-security specialists to think like attackers. - -The outcomes of this stage should help lay the foundation of secure design and considerations. - -**Example Low Maturity Scenario:** - -Following vague feature requirements the design includes caching data to a local unencrypted database with a hardcoded password. - -Remote data store access secrets are hardcoded in the configuration files. All communication between backend systems is plaintext. - -Frontend serves data over GraphQL as a thin layer between caching system and end user. - -GraphQL queries are dynamically translated to SQL, Elasticsearch and NoSQL queries. Access to data is protected with basic auth set to _1234:1234_ for development purposes. - -**Example High Maturity Scenario:** - -Based on a detailed threat model defined and updated through code, the team decides the following: - -* Local encrypted caches need to expire and auto-purged. -* Communication channels encrypted and authenticated. -* All secrets persisted in shared secrets store. -* Frontend designed with permissions model integration. -* Permissions matrix defined. -* Input is escaped output is encoded appropriately using well established libraries. - -#### 1.3. Development Stage - -The development stage is where assumptions and decisions made in the previous steps will be tested. It's also the stage where implementation specific bugs happen. - -There has been [extensive discussion](https://docs.google.com/presentation/d/1zbj9XBiv6r6zla0KHNfs63Ux45QZAfRut2zlK7o-dRw/mobilepresent?slide=id.g7c8a58b51e_0_4) on how to approach secure application development from an agile point of view. However, it ultimately depends on parameters specific to each organisation, such as engineering culture, size and competency/seniority of teams, tools available and the maturity of the security programme. - -Anecdotal evidence points towards code pattern libraries, code anti-pattern libraries, library wrappers with secure defaults, linter configuration, and extensive testing suites that attempt to test for security abuse stories. - -SAMM at this stage offers the following [generic implementation considerations](https://owaspsamm.org/model/implementation/): - -![SAMM Implementation Considerations](images/impl_samm.png "SAMM Implementation Considerations") - -At any maturity level, linters can be introduced to ensure that consistent code is being added. For most linters, there are IDE integrations providing software engineers with the ability to validate code correctness during development time. Several linters also include security specific rules. This allows for basic security checks before the code is even committed. For example, if you write in Typescript, you can use [tslint](https://github.com/palantir/tslint) along with [tslint-config-security](https://www.npmjs.com/package/tslint-config-security) to easily and quickly perform basic checks. - -However, linters cannot detect vulnerabilities in third party libraries, and as software supply chain attacks spread, this consideration becomes more important. To track third party library usage and audit their security you can use [Dependency Check/Track](https://dependencytrack.org/). - -To tackle the security of code developed in-house, OWASP offers an extensive collection of [Cheatsheets](https://cheatsheetseries.owasp.org/) demonstrating how to implement features securely. Moreover, the Security Knowledge Framework[1] offers an extensive library of code patterns spanning several programming languages. These patterns can be used to not only jumpstart the development process, but also do so securely. - -![SKF Code](images/skf_code.png "SKF Code") - -Last, there is an abundance of libraries and frameworks implementing secure defaults. For frontend development, [ReactJS](https://reactjs.org/) seems to be the latest favourite in the Javascript world. - -On the database side, there are [ORM](https://sequelize.org/) libraries and [Query Builders](https://github.com/kayak/pypika) for most languages. - -If you write in Java, the [ESAPI project](https://www.javadoc.io/doc/org.owasp.esapi/esapi/latest/index.html) offers several methods to securely implement features, ranging from Cryptography to input escaping and output encoding. - -**Example Low Maturity Scenario:** - -The team attempted to build the requested features using vanilla NodeJS, connectivity to backend systems is validated by firing an internal request to `/healthcheck?remoteHost=` which attempts to run a ping command against the IP specified. All secrets are hard coded. The team uses off the shelf GraphQL libraries but versions are not checked using [NPM Audit](https://docs.npmjs.com/cli/audit). Development is performed by pushing to master which triggers a webhook that uses FTP to copy latest master to the development server which will become production once development is finished. - -**Example High Maturity Scenario:** - -Team members have access to comprehensive documentation and a library of code snippets they can use to accelerate development. - -Linters are bundled with pre-commit hooks and no code reaches master without peer review. - -Pre-merge tests are executed before merging code into master. Tests run a comprehensive suite of tests covering unit tests, service acceptance tests, unit tests as well as regression tests. - -Once a day a pipeline of specially configured static code analysis tools runs against the features merged that day, the results are triaged by a trained security team and fed to engineering. - -There is a cronjob executing Dynamic Analysis tools against Staging with a similar process. - -Pentests are conducted against features released on every release and also periodically against the whole software stack. - -#### 1.4. Testing Stage - -This stage can be used to validate software correctness and it's results as a metric for the security related decisions of the previous stages. At this stage both automated and manual testing can be performed. SAMM again offers 3 maturity levels across Architecture Reviews, Requirements testing, and Security Testing. Instructions can be found [here](https://owaspsamm.org/model/verification/) and a screenshot is listed below. - -![SAMM Testing](images/samm_testing.png "SAMM Testing") - -Testing can be performed several ways and it highly depends on the nature of the software, the organisation's cadence, and the regulatory requirements among other things. - -If available, automation is a good idea as it allows detection of easy to find vulnerabilities without much human interaction. - -If the application communicates using a web-based protocol, the [ZAP](https://github.com/zaproxy/zaproxy) project can be used to automate a great number of web related attacks and detection. ZAP can be orchestrated using its REST API and it can even automate multi-stage attacks by leveraging its Zest scripting support. - -Vulnerabilities from ZAP and a wide variety of other tools can be imported and managed using a dedicated defect management platform such as [Defect Dojo](https://github.com/DefectDojo/django-DefectDojo)(screenshot below). - -![Defect Dojo](images/defectdojo.png "Defect Dojo") - -For manual testing the [Web](https://github.com/OWASP/wstg) and [Mobile](https://github.com/OWASP/owasp-mstg) Security Testing Guides can be used to achieve a base level of quality for human driven testing. - -**Example Low Maturity Scenario:** - -The business deployed the system to production without testing. Soon after, the client's routine pentests uncovered deep flaws with access to backend data and services. The remediation effort was significant. - -**Example High Maturity Scenario:** - -The application features received Dynamic Automated testing when each reached staging, a trained QA team validated business requirements that involved security checks. A security team performed an adequate pentest and gave a sign-off. - -#### 1.5. Release Stage - -Hopefully by this stage, features are adequately designed, written, and tested. This stage involves configuration, resilience and observability. Here, the Mod Security [Core Rule Set](https://github.com/OWASP/www-project-modsecurity-core-rule-set) can be used to effectively detect and block several attacks against the platform. - -Moreover, secure configuration standards can be tested for using the [Open Policy Agent](https://www.openpolicyagent.org/). - -Last projects such as the [ELK stack](https://www.elastic.co/elastic-stack), [Grafana](https://grafana.com/) and [Prometheus](https://prometheus.io/docs/introduction/overview/) can be used to aggregate logging and provide observability. - -However, no matter the WAFs, Logging, and secure configuration enforced at this stage, incidents will occur eventually. Incident management is a complicated and high stress process. To prepare organisations for this, SAMM includes a section on [incident management](https://owaspsamm.org/model/operations/incident-management/) involving simple questions for stakeholders to answer so you can determine incident preparedness accurately. - -![SAMM Release](images/samm_release.png "SAMM Release") - -**Example low maturity scenario:** - -The API was queryable by anyone and GraphQL introspection was enabled since all components were left in debug configuration. - -Sensitive API paths were not whitelisted. The team found that the application was attacked when the server showed very high CPU load. The response was to bring the system down, very little information about the attack was found apart from the fact that someone was mining cryptocurrencies on the server. - -**Example High Maturity scenario:** - -The CI/CD system, when migrating successful QA environments to production, applies appropriate configuration to all components. Configuration is tested periodically for drift. - -Secrets live in-memory only and are persisted in a dedicated Secrets Storage solution such as Hashicorp Vault. - -All application's ingress points are protected by a WAF coupled with DoS protection. - -Logging from all components gets aggregated in dashboards and alerts are raised based on several Thresholds and events. There are canary values and events fired against monitoring from time to time to validate it works. - -Business continuity and Security teams run incident management drills periodically to refresh incident playbook knowledge. - -### 2. The In-Between Stage - -A successful project will hopefully exist for several SDLC cycles. Each cycle adding features and fixing bugs based on the input from previous ones. The time in this stage is often invested in [Retrospective Meetings](https://www.scrum.org/resources/what-is-a-sprint-retrospective), metrics gathering, various admin work, and training or culture building. - -The Open Source community at this stage comes to the rescue with a number of high quality guides, applications, frameworks, and complete integrated solutions. - -Concerning metrics, the community has been quite vocal on what to measure and how important it is. The OWASP CISO guide offers 3 broad categories of SDLC metrics[1] which can be used to measure effectiveness of security practices. Moreover, there is a number of presentations on what could be leveraged to improve a security programme, starting from Marcus' Ranum's [keynote](https://www.youtube.com/watch?v=yW7kSVwucSk) at Appsec California[1], Caroline Wong's similar [presentation](https://www.youtube.com/watch?v=dY8IuQ8rUd4) and [this presentation](https://www.youtube.com/watch?v=-XI2DL2Uulo) by J. Rose and R. Sulatycki. These among several writeups by private companies all offering their own version of what could be measured. - -However, metrics won't necessarily improve without training engineering teams and somehow building a security-minded culture. Security training is a long and complicated discussion. There is a variety of approaches out there, on the testing-only end of the spectrum there is fully black box virtual machines such as [DVWA](http://www.dvwa.co.uk/), [Metasploitable series](https://metasploit.help.rapid7.com/docs/metasploitable-2) and the [VulnHub](https://www.vulnhub.com/) project. - -The code & remediation end of the spectrum isn't as well-developed, mainly due to the complexity involved in building and distributing such material. However, there are some respectable solutions, [Remediate The Flag](https://www.remediatetheflag.com/) can be used to setup a code based challenge. - -![Remediate the Flag](images/rtf.png "Remediate the Flag") - -However, if questionnaires are the preferred medium, or if the organisation is looking for self-service testing, [Secure Coding Dojo](https://github.com/trendmicro/SecureCodingDojo) is an interesting solution. - -More on the self-service side, the Security Knowledge Framework has released several [Labs](https://owasp-skf.gitbook.io/asvs-write-ups/) that each showcase one vulnerability and provides information on how to exploit it. - -However, to our knowledge, the most flexible project out there is probably the [Juice Shop](https://github.com/bkimminich/juice-shop), deployed on Heroku with one click, it offers both CTF functionality and a self-service standalone application that comes with solution detection and a comprehensive progress-board. - -![Juice Shop](images/juiceshop.png "Juice Shop") - -Bringing it all together, a security team could gather metrics on vulnerabilities detected by team or service using the detection related projects outlined above, then either ask the teams to do the self-service training and validate the effectiveness with a questionnaire solution or deliver the training themselves. - -### 5. Conclusion - -Security doesn't have to be hard. By following well established guidelines and using well known solutions an organisation can achieve a good level of security without too much resource allocation. - -Below is a diagram summarising tools used at each stage of development. - -![Tools Summary](images/summary.png "Tools Summary") From 4fad042a0c2ccb58c7cc4fecec2811f33212f537 Mon Sep 17 00:00:00 2001 From: northdpole Date: Sat, 28 Aug 2021 14:00:32 +0100 Subject: [PATCH 11/11] rm old scripts --- scripts/lambda/function.py | 92 ---- scripts/owasp_graph/README.md | 34 -- scripts/owasp_graph/map.dot | 461 ------------------ .../owasp_project_metadata_mindmap_gen.py | 347 ------------- ...owasp_project_metadata_mindmap_gen_test.py | 98 ---- scripts/owasp_graph/requirements.txt | 40 -- scripts/owasp_graph/test_data/map.dot | 19 - 7 files changed, 1091 deletions(-) delete mode 100644 scripts/lambda/function.py delete mode 100644 scripts/owasp_graph/README.md delete mode 100644 scripts/owasp_graph/map.dot delete mode 100644 scripts/owasp_graph/owasp_project_metadata_mindmap_gen.py delete mode 100644 scripts/owasp_graph/owasp_project_metadata_mindmap_gen_test.py delete mode 100644 scripts/owasp_graph/requirements.txt delete mode 100644 scripts/owasp_graph/test_data/map.dot diff --git a/scripts/lambda/function.py b/scripts/lambda/function.py deleted file mode 100644 index 8d85c7bac..000000000 --- a/scripts/lambda/function.py +++ /dev/null @@ -1,92 +0,0 @@ -import boto3 -import json -import os -from pprint import pprint -import yaml -import json - -def filter_cre_id(cre_file,cre_id): - res = [] - cres = "" - try: - cres = list(yaml.safe_load_all(cre_file))[0].values() - except Exception as ex: - pprint(ex) # probably malformed file - for thing in cres: - for cre in thing: - if cre_id in cre.get('CRE'): - res.append(cre) - return res - -def filter_all(cre_file): - res = [] - cres = "" - try: - cres = list(yaml.safe_load_all(cre_file))[0].values() - except Exception as ex: - pprint(ex) # probably malformed file - for thing in cres: - for cre in thing: - res.append(cre) - return res - -def filter_cre_contains_tag(cre_file, tag): - res = [] - cres = "" - try: - cres = list(yaml.safe_load_all(cre_file))[0].values() - except Exception as ex: - pprint(ex) # probably malformed file - for thing in cres: - for cre in thing: - if tag in cre['metadata']['tags']: - res.append(cre) - return res - -def cre_to_json_str(cre): - res = json.dumps(cre) - return res or "" - -def list_files(bucket): - s3 = boto3.client('s3') - objects = s3.list_objects_v2(Bucket=bucket) - return objects - -def get_file(bucket,file_obj): - s3_res = boto3.resource('s3') - return s3_res.Object(bucket,file_obj['Key']).get()['Body'].read().decode() - -def lambda_handler(event, context): - ret = { - 'statusCode': 200, - 'body':"", - } - # return ret - cres = [] - try: - cre_id=event.get("queryStringParameters").get('cre') - tag=event.get("queryStringParameters").get('tag') - # return ret - bucket = os.environ.get("bucket_name") - objects = list_files(bucket) - for file_obj in objects.get('Contents'): - obj=[] - cre_file = get_file(bucket,file_obj) - if cre_id: - print("Filtering By CREID") - obj = filter_cre_id(cre_file,cre_id) - elif tag: - print("Filtering By Tag") - obj = filter_cre_contains_tag(cre_file,tag) - # else: - # obj=filter_all(cre_file) - if obj: - cres.extend(obj) - return_obj = [] - for cre in cres: - return_obj.append(cre) - ret['body'] = ret['body'] + cre_to_json_str(return_obj) - except Exception as ex: - ret['body'] = str(ex) - - return ret diff --git a/scripts/owasp_graph/README.md b/scripts/owasp_graph/README.md deleted file mode 100644 index 441fe4597..000000000 --- a/scripts/owasp_graph/README.md +++ /dev/null @@ -1,34 +0,0 @@ -Create Graph With OWASP Projects -=== -Warning, this is highly experimental. -Main purpose is to showcase the metadata in `index.md` - -This script is meant to parse a list of organisations and/or repositories which hold OWASP projects and create a mind map of them. -Resulting mindmap is organised by SDLC step the projects fit in, by default it categorises non-sdlc projects as general. -It uses a persistent sqlite3 file to cache results so it doesn't get throttled by Github. -Cache can be used to generate new data groupings or for further analysis. -Map generation is independed from data retrieval - -Usage ----- - -Preferably in a virtual environment - -``` -pip install -r requirements.txt -GITHUB_USERNAME= GITHUB_TOKEN= python owasp_project_metadata_mindmap_gen.py -python owasp_project_metadata_mindmap_gen.py --from_cache script_cache.sqlite # generate map from saved data -``` - -Output is a `map.dot`, `map.pdf` and a `map.svg` file. -For now these files only have basic data since most repos do not hold interesting metadata - -Future Improvements ----- - -* Make into github action which runs on a cron schedule -* Add colours for each step of the SDLC and related items -* Improve project links -* Make interactive by creation of a github.io page with javascript that parses `map.dot` and at a minum provides usage instructions (and more info) in a sidepanel when clicking on a node. -* When projects update their index.md metadata, create a schema and validate metadata against the schema. -* fix unittests diff --git a/scripts/owasp_graph/map.dot b/scripts/owasp_graph/map.dot deleted file mode 100644 index 361629901..000000000 --- a/scripts/owasp_graph/map.dot +++ /dev/null @@ -1,461 +0,0 @@ -graph G { -rankdir=LR; -General; -sdlc -- General; -"OWASP Damn Vulnerable Web Sockets" [URL="https://github.com/OWASP/www-project-damn-vulnerable-web-sockets/blob/f4dbabe07e51ce7ed38c71a59ff164e10f482cf5/info.md", url="http://somewhere"]; -General -- "OWASP Damn Vulnerable Web Sockets"; -"OWASP Mobile Audit" [URL="https://github.com/OWASP/www-project-mobile-audit/blob/0a604ac3939ee944ed0b3021abcc4cc3d699f92f/info.md", url="http://somewhere"]; -General -- "OWASP Mobile Audit"; -"OWASP Ontology Driven Threat Modeling Framework" [URL="https://github.com/OWASP/www-project-ontology-driven-threat-modeling-framework/blob/4308236ae7ca584c02fb157dbd02938ae6e7aa0e/info.md", url="http://somewhere"]; -General -- "OWASP Ontology Driven Threat Modeling Framework"; -"OWASP Cyber Defense Framework" [URL="https://github.com/OWASP/www-project-cyber-defense-framework/blob/c980ea54be59029764a157651c74486c62386fde/info.md", url="http://somewhere"]; -General -- "OWASP Cyber Defense Framework"; -"OWASP Application Gateway" [URL="https://github.com/OWASP/www-project-application-gateway/blob/1f02c6d725ab6cb40a92b95070a169591438aa5a/info.md", url="http://somewhere"]; -General -- "OWASP Application Gateway"; -"OWASP Laravel Goat" [URL="https://github.com/OWASP/www-project-laravel-goat/blob/2cf62d7fcd5dea9f39dccb3e7647a18b86ee7a19/info.md", url="http://somewhere"]; -General -- "OWASP Laravel Goat"; -"OWASP Vulnerable Container Hub" [URL="https://github.com/OWASP/www-project-vulnerable-container-hub/blob/04ae8a35432f4e1f90b43e7263e5f74ff3f0abae/info.md", url="http://somewhere"]; -General -- "OWASP Vulnerable Container Hub"; -"OWASP Blockchain Distributed Infrastructure" [URL="https://github.com/OWASP/www-project-blockchain-distributed-infrastructure/blob/82a8001e4a5607b1768e2d9565d9ebf45c96da0b/info.md", url="http://somewhere"]; -General -- "OWASP Blockchain Distributed Infrastructure"; -"OWASP crAPI" [URL="https://github.com/OWASP/www-project-crapi/blob/c524d08eed1dddef942789db52563f0313dd4b1b/info.md", url="http://somewhere"]; -General -- "OWASP crAPI"; -"OWASP CloudSheep" [URL="https://github.com/OWASP/www-project-cloudsheep/blob/f2b4beb6b18bd546d99daf7b5ee6b86683c08de0/info.md", url="http://somewhere"]; -General -- "OWASP CloudSheep"; -"OWASP Dependency-Check" [URL="https://github.com/OWASP/www-project-dependency-check/blob/a4f28f58a24ebeadad402f30e5d0123ea0cc7373/info.md", url="http://somewhere"]; -General -- "OWASP Dependency-Check"; -"OWASP Vulnerable Web Applications Directory" [URL="https://github.com/OWASP/www-project-vulnerable-web-applications-directory/blob/92754c58d05d34e12dbce8e555af77a43455f047/info.md", url="http://somewhere"]; -General -- "OWASP Vulnerable Web Applications Directory"; -"OWASP Maryam" [URL="https://github.com/OWASP/www-project-maryam/blob/2ffd4d7383bd44125e47dfbda2e6ebee5686e1d9/info.md", url="http://somewhere"]; -General -- "OWASP Maryam"; -"OWASP IoT Security Verification Standard" [URL="https://github.com/OWASP/www-project-iot-security-verification-standard/blob/fa0bb38c9e694bd0e6f27721ff27404203848ab2/info.md", url="http://somewhere"]; -General -- "OWASP IoT Security Verification Standard"; -"OWASP Juice Shop" [URL="https://github.com/OWASP/www-project-juice-shop/blob/f022311e955a16cd806e61cf85a7ebf74b299cc7/info.md", url="http://somewhere"]; -General -- "OWASP Juice Shop"; -"OWASP belva" [URL="https://github.com/OWASP/www-project-belva/blob/7ce087761bbd38586e5c7a8a402e95dc436d38f7/info.md", url="http://somewhere"]; -General -- "OWASP belva"; -"OWASP SecureFlag Open Platform" [URL="https://github.com/OWASP/www-project-secureflag-open-platform/blob/03d5f8e3a37aeb6f59c262c8eaf821abbe690418/info.md", url="http://somewhere"]; -General -- "OWASP SecureFlag Open Platform"; -"OWASP AWScanner" [URL="https://github.com/OWASP/www-project-awscanner/blob/541cba9989f6c08d0505463473e8f16a059bc085/info.md", url="http://somewhere"]; -General -- "OWASP AWScanner"; -"OWASP Web Application Firewall Evaluation Criteria Project (WAFEC)" [URL="https://github.com/OWASP/www-project-wafec/blob/9b1763849cfe4374eb1dfe4a47cce9f6708d9754/info.md", url="http://somewhere"]; -General -- "OWASP Web Application Firewall Evaluation Criteria Project (WAFEC)"; -"OWASP Enterprise Security API (ESAPI)" [URL="https://github.com/OWASP/www-project-enterprise-security-api/blob/ec48cd0169337b13d3d008c8eb65efbd37d66507/info.md", url="http://somewhere"]; -General -- "OWASP Enterprise Security API (ESAPI)"; -"OWASP Secure Logging Benchmark" [URL="https://github.com/OWASP/www-project-secure-logging-benchmark/blob/73eeea989056b48eb6ad44786ef52484cfc65f26/info.md", url="http://somewhere"]; -General -- "OWASP Secure Logging Benchmark"; -"OWASP Education and Training Committee" [URL="https://github.com/OWASP/www-committee-education-and-training/blob/b7db05feabf1ca363da6580e90ee64e7b7f84c59/info.md", url="http://somewhere"]; -General -- "OWASP Education and Training Committee"; -"OWASP ModSecurity Core Rule Set" [URL="https://github.com/OWASP/www-project-modsecurity-core-rule-set/blob/94fa829e023c846a65957049d634d28c7f8103f0/info.md", url="http://somewhere"]; -General -- "OWASP ModSecurity Core Rule Set"; -"OWASP VulnerableApp" [URL="https://github.com/OWASP/www-project-vulnerableapp/blob/ab2b36602d57170bf350a5696320c8540694357b/info.md", url="http://somewhere"]; -General -- "OWASP VulnerableApp"; -"OWASP Cloud Security Mentor" [URL="https://github.com/OWASP/www-project-cloud-security-mentor/blob/793ec1ad6a80f2ef9a21be645e1ef3821e94c155/info.md", url="http://somewhere"]; -General -- "OWASP Cloud Security Mentor"; -"OWASP Voice Automated Application Security" [URL="https://github.com/OWASP/www-project-voice-automated-application-security/blob/06dbc52941b24afdbb9ffeca91ad3d777aeb97e3/info.md", url="http://somewhere"]; -General -- "OWASP Voice Automated Application Security"; -"OWASP DevSecOps Guideline" [URL="https://github.com/OWASP/www-project-devsecops-guideline/blob/c86be2446cc18af23ba8b281aef280431017a8cc/info.md", url="http://somewhere"]; -General -- "OWASP DevSecOps Guideline"; -"OWASP mobile security" [URL="https://github.com/OWASP/www-project-mobile-security/blob/e4772b8dd1e13dabba53037d99da71cc82664f7a/info.md", url="http://somewhere"]; -General -- "OWASP mobile security"; -"OWASP SecurityRAT" [URL="https://github.com/OWASP/www-project-securityrat/blob/be17002d3a1763f63a8f9ed49ecf19e56d73242c/info.md", url="http://somewhere"]; -General -- "OWASP SecurityRAT"; -"OWASP [GROUPNAME]" [URL="https://github.com/OWASP/www-project-developer-guide/blob/621b3a6e7d31ec9dce7e6d9e9a674e722fa1126e/info.md", url="http://somewhere"]; -General -- "OWASP [GROUPNAME]"; -"OWASP Knowledge Based Authentication Performance Metrics" [URL="https://github.com/OWASP/www-project-knowledge-based-authentication-performance-metrics/blob/9416ee26a3b64049f5c0ff139bdb83724c07057b/info.md", url="http://somewhere"]; -General -- "OWASP Knowledge Based Authentication Performance Metrics"; -"OWASP Defectdojo" [URL="https://github.com/OWASP/www-project-defectdojo/blob/6dddfbd82f7f5d305048de429f2804e25ecfd352/info.md", url="http://somewhere"]; -General -- "OWASP Defectdojo"; -"OWASP Qrljacker" [URL="https://github.com/OWASP/www-project-qrljacker/blob/b9c66b43db0c1a7ed7e3628f27619da34d2ce2c3/info.md", url="http://somewhere"]; -General -- "OWASP Qrljacker"; -"OWASP Top 10 Fuer Entwickler" [URL="https://github.com/OWASP/www-project-top-10-fuer-entwickler/blob/4de184ac5444b5ebaf9a7c95535a5a79a6fa1673/info.md", url="http://somewhere"]; -General -- "OWASP Top 10 Fuer Entwickler"; -"OWASP Best Practices In Vulnerability Disclosure And Bug Bounty Programs" [URL="https://github.com/OWASP/www-project-best-practices-in-vulnerability-disclosure-and-bug-bounty-programs/blob/2ca4e529ec4d350e9aa58eb9cdb2368185e199d7/info.md", url="http://somewhere"]; -General -- "OWASP Best Practices In Vulnerability Disclosure And Bug Bounty Programs"; -"OWASP Project and Chapter Example" [URL="https://github.com/OWASP/www-project-google-assistant/blob/d85d900a8530e2b855bb9ceaa88430cc9e7b0d3f/info.md", url="http://somewhere"]; -General -- "OWASP Project and Chapter Example"; -"OWASP little web application firewall" [URL="https://github.com/OWASP/www-project-little-web-application-firewall/blob/948f036c5a5aac8a04836dde2fe8095621a311fa/info.md", url="http://somewhere"]; -General -- "OWASP little web application firewall"; -"OWASP Container Security Verification Standard" [URL="https://github.com/OWASP/www-project-container-security-verification-standard/blob/6865ca426787de551a89b7602387282c809077cb/info.md", url="http://somewhere"]; -General -- "OWASP Container Security Verification Standard"; -"OWASP Application Security Curriculum" [URL="https://github.com/OWASP/www-project-application-security-curriculum/blob/6ac0ffc8c442d61fbb0b66f3bbb66655a6af7115/info.md", url="http://somewhere"]; -General -- "OWASP Application Security Curriculum"; -"OWASP Vulnerable Web Application" [URL="https://github.com/OWASP/www-project-vulnerable-web-application/blob/290c159aed7528a6096843423b8335ab891fd8cf/info.md", url="http://somewhere"]; -General -- "OWASP Vulnerable Web Application"; -"OWASP Threatspec" [URL="https://github.com/OWASP/www-project-threatspec/blob/08794cbbf5b32054f56000fbae845dc649a83782/info.md", url="http://somewhere"]; -General -- "OWASP Threatspec"; -"OWASP Off The Record 4 Java" [URL="https://github.com/OWASP/www-project-off-the-record-4-java/blob/766eb1c646326ca4b753b4c4bc3eefdacd8755a9/info.md", url="http://somewhere"]; -General -- "OWASP Off The Record 4 Java"; -"OWASP webgoat php" [URL="https://github.com/OWASP/www-project-webgoat-php/blob/aaf3f2976ffa0bd86b08e7d1f0a28ede87a28089/info.md", url="http://somewhere"]; -General -- "OWASP webgoat php"; -"OWASP Appsensor" [URL="https://github.com/OWASP/www-project-appsensor/blob/79d8316d4ef000aee35e8e27e7cd0ca7e07f263f/info.md", url="http://somewhere"]; -General -- "OWASP Appsensor"; -"OWASP Python Security" [URL="https://github.com/OWASP/www-project-python-security/blob/464a13ed6511ceefd048a5ff8f501bb8c4f20c1c/info.md", url="http://somewhere"]; -General -- "OWASP Python Security"; -"OWASP Jotp" [URL="https://github.com/OWASP/www-project-jotp/blob/07f5e3107c93936c076bf3aca0dc5f42c3133a1b/info.md", url="http://somewhere"]; -General -- "OWASP Jotp"; -"OWASP OWTF" [URL="https://github.com/OWASP/www-project-owtf/blob/b265c1db0fe44a83aba9eeedd2094e93517da525/info.md", url="http://somewhere"]; -General -- "OWASP OWTF"; -"OWASP Dvsa" [URL="https://github.com/OWASP/www-project-dvsa/blob/39c7892fcd396b99526e88ca5ce8723f729bca52/info.md", url="http://somewhere"]; -General -- "OWASP Dvsa"; -"OWASP Hackademic Challenges" [URL="https://github.com/OWASP/www-project-hackademic-challenges/blob/f0fbbf444254cd76625213816d44e481786ac2b7/info.md", url="http://somewhere"]; -General -- "OWASP Hackademic Challenges"; -"OWASP D4N155" [URL="https://github.com/OWASP/www-project-d4n155/blob/ceee89010d5007f7d3961e3032b7c3a5bee2a01b/info.md", url="http://somewhere"]; -General -- "OWASP D4N155"; -"OWASP deepviolet-tls-ssl-scanner" [URL="https://github.com/OWASP/www-project-deepviolet-tls-ssl-scanner/blob/339d72fbd5d0fad03fa3578fb4b485cf15c23b3a/info.md", url="http://somewhere"]; -General -- "OWASP deepviolet-tls-ssl-scanner"; -"OWASP O-Saft" [URL="https://github.com/OWASP/www-project-o-saft/blob/ec2b605efdca67abe616d038d0bc8bdb73f50b82/info.md", url="http://somewhere"]; -General -- "OWASP O-Saft"; -"OWASP Vulnerability Management Guide" [URL="https://github.com/OWASP/www-project-vulnerability-management-guide/blob/b722382d9e178d1b584e3943f3ad0c27094dec9a/info.md", url="http://somewhere"]; -General -- "OWASP Vulnerability Management Guide"; -"OWASP Web Mapper" [URL="https://github.com/OWASP/www-project-web-mapper/blob/90e504776b7db2a6f873b7d81ebd480adbaa123c/info.md", url="http://somewhere"]; -General -- "OWASP Web Mapper"; -"OWASP Access Log Parser" [URL="https://github.com/OWASP/www-project-access-log-parser/blob/a11a3e47716168ffcfe34eb0559ba1c50a664e92/info.md", url="http://somewhere"]; -General -- "OWASP Access Log Parser"; -"OWASP Secure Medical Device Deployment Standard" [URL="https://github.com/OWASP/www-project-secure-medical-device-deployment-standard/blob/6439fa42f1a9c4244bc94f5f92456108b7a2ce16/info.md", url="http://somewhere"]; -General -- "OWASP Secure Medical Device Deployment Standard"; -"OWASP Blockchain Security Framework" [URL="https://github.com/OWASP/www-project-blockchain-security-framework/blob/8740235d796af37effab4f49ea52578934769e5e/info.md", url="http://somewhere"]; -General -- "OWASP Blockchain Security Framework"; -"OWASP Compliance Committee" [URL="https://github.com/OWASP/www-committee-compliance/blob/c9df4e8e1f7a3f6029eba520e07b5dbd652635d2/info.md", url="http://somewhere"]; -General -- "OWASP Compliance Committee"; -"OWASP Virtual Patching Best Practices" [URL="https://github.com/OWASP/www-project-virtual-patching-best-practices/blob/e1c4ebd1cce04918177822fac37771cc8e1dbe3e/info.md", url="http://somewhere"]; -General -- "OWASP Virtual Patching Best Practices"; -"OWASP LATAM at Home 2020" [URL="https://github.com/OWASP/www-event-2020-latam-at-home/blob/23cfb832d58b4a645033b82710c39e2a7fb1fe74/info.md", url="http://somewhere"]; -General -- "OWASP LATAM at Home 2020"; -"OWASP Serverless Goat" [URL="https://github.com/OWASP/www-project-serverless-goat/blob/d4d3744d6be298567b125cc8b7d25914520f318d/info.md", url="http://somewhere"]; -General -- "OWASP Serverless Goat"; -"OWASP Php" [URL="https://github.com/OWASP/www-project-php/blob/1f665eb3400775e57ef30eb00492386c849faa44/info.md", url="http://somewhere"]; -General -- "OWASP Php"; -"OWASP .Net" [URL="https://github.com/OWASP/www-project-.net/blob/a6f4bbd14f639f52f22743e51ddadedefccde310/info.md", url="http://somewhere"]; -General -- "OWASP .Net"; -"OWASP DPD (DDOS Prevention using DPI)" [URL="https://github.com/OWASP/www-project-dpd/blob/326866b5593c03702011d40b308a2437833d92c2/info.md", url="http://somewhere"]; -General -- "OWASP DPD (DDOS Prevention using DPI)"; -"OWASP Zezengorri Code" [URL="https://github.com/OWASP/www-project-zezengorri-code/blob/6d19beaca5d02a714db4832b878b2ed35393ae9a/info.md", url="http://somewhere"]; -General -- "OWASP Zezengorri Code"; -"OWASP jvmxray" [URL="https://github.com/OWASP/www-project-jvmxray/blob/aa47a892f6ca0b39615d857f96506c83a77f1c84/info.md", url="http://somewhere"]; -General -- "OWASP jvmxray"; -"OWASP DevSlop" [URL="https://github.com/OWASP/www-project-devslop/blob/f92c7a44f6ef39b0e0dcb6868105b8e795513c6c/info.md", url="http://somewhere"]; -General -- "OWASP DevSlop"; -"OWASP Cloud-Native Application Security Top 10" [URL="https://github.com/OWASP/www-project-cloud-native-application-security-top-10/blob/f13f5e5fdb717280cd9c1405e68ac252261db1e3/info.md", url="http://somewhere"]; -General -- "OWASP Cloud-Native Application Security Top 10"; -"OWASP Software Composition Security" [URL="https://github.com/OWASP/www-project-software-composition-security/blob/73f7bd8fb578cd5f129da91d247d1d7939b9e515/info.md", url="http://somewhere"]; -General -- "OWASP Software Composition Security"; -"OWASP Security Integration System" [URL="https://github.com/OWASP/www-project-security-integration-system/blob/1659b03e8dc39c34c57ccc9aac2db551c8fb0e37/info.md", url="http://somewhere"]; -General -- "OWASP Security Integration System"; -"OWASP Jupiter" [URL="https://github.com/OWASP/www-project-jupiter/blob/ce51248bb2a685bf04346b835c091895d522ce3d/info.md", url="http://somewhere"]; -General -- "OWASP Jupiter"; -"OWASP Podcast" [URL="https://github.com/OWASP/www-project-podcast/blob/8ffdd3005ae8fb7063a6d0ab74521d4f8f3a2a14/info.md", url="http://somewhere"]; -General -- "OWASP Podcast"; -"OWASP Online Academy" [URL="https://github.com/OWASP/www-project-online-academy/blob/0ab7f995c1cdda58781de51d0fec9ea14439fc06/info.md", url="http://somewhere"]; -General -- "OWASP Online Academy"; -"OWASP Honeypot" [URL="https://github.com/OWASP/www-project-honeypot/blob/359c946de4c612b357275baccbc4d0f6d1c1320c/info.md", url="http://somewhere"]; -General -- "OWASP Honeypot"; -"OWASP SecureTea Project" [URL="https://github.com/OWASP/www-project-securetea/blob/88ac6ade45490523c4eab874c43e8289b0aa6427/info.md", url="http://somewhere"]; -General -- "OWASP SecureTea Project"; -"OWASP Go Secure Coding Practices Guide" [URL="https://github.com/OWASP/www-project-go-secure-coding-practices-guide/blob/dc3766da620db2bf41599f9fadd7d343cbec2204/info.md", url="http://somewhere"]; -General -- "OWASP Go Secure Coding Practices Guide"; -"OWASP Zsc Tool" [URL="https://github.com/OWASP/www-project-zsc-tool/blob/140eeef0a41a5068d7390232d338a594ae6b560b/info.md", url="http://somewhere"]; -General -- "OWASP Zsc Tool"; -"OWASP Amass" [URL="https://github.com/OWASP/www-project-amass/blob/18466e9e657b6b7ceaf4b73341ece8a2d2a6d3b1/info.md", url="http://somewhere"]; -General -- "OWASP Amass"; -"OWASP Redteam Toolkit" [URL="https://github.com/OWASP/www-project-redteam-toolkit/blob/4bee6e9b170ef249f7c296f4c77dcc3e2555d09b/info.md", url="http://somewhere"]; -General -- "OWASP Redteam Toolkit"; -"OWASP hacking-lab" [URL="https://github.com/OWASP/www-project-hacking-lab/blob/58bf0dde06883484c179cb244e320bf918e42125/info.md", url="http://somewhere"]; -General -- "OWASP hacking-lab"; -"OWASP Auth" [URL="https://github.com/OWASP/www-project-auth/blob/94cafd477f605ee6c83060e1e84b03335ae016ff/info.md", url="http://somewhere"]; -General -- "OWASP Auth"; -"OWASP cloud security" [URL="https://github.com/OWASP/www-project-cloud-security/blob/64e023affd201c2b343c1fe3ab99224311f4b26c/info.md", url="http://somewhere"]; -General -- "OWASP cloud security"; -"OWASP MITM Guard" [URL="https://github.com/OWASP/www-project-mitm-guard/blob/e28ae7ae6b4b81a980e4da17e75597312544624d/info.md", url="http://somewhere"]; -General -- "OWASP MITM Guard"; -"OWASP Revelo" [URL="https://github.com/OWASP/www-project-revelo/blob/77158582e5047557c53fbcf1b5cf2fd2622c139d/info.md", url="http://somewhere"]; -General -- "OWASP Revelo"; -"OWASP Json Sanitizer" [URL="https://github.com/OWASP/www-project-json-sanitizer/blob/cfa0685f9e018e81266a033805f73cb60c4b470e/info.md", url="http://somewhere"]; -General -- "OWASP Json Sanitizer"; -"OWASP Bug Logging Tool" [URL="https://github.com/OWASP/www-project-bug-logging-tool/blob/002c203935e887b92613232eeb48b08f3aef7c37/info.md", url="http://somewhere"]; -General -- "OWASP Bug Logging Tool"; -"OWASP WinFIM.NET" [URL="https://github.com/OWASP/www-project-winfim.net/blob/315106e10826c8fd8bdde7798a924299269f9c6d/info.md", url="http://somewhere"]; -General -- "OWASP WinFIM.NET"; -"OWASP Risk Assessment Framework" [URL="https://github.com/OWASP/www-project-risk-assessment-framework/blob/da6269adf2aadfbd54cfcf0c33a3df5357dddfcc/info.md", url="http://somewhere"]; -General -- "OWASP Risk Assessment Framework"; -"OWASP SideKEK" [URL="https://github.com/OWASP/www-project-sidekek/blob/b70906af17ec021cf2de45d87733587a1b845255/info.md", url="http://somewhere"]; -General -- "OWASP SideKEK"; -"OWASP Seeker" [URL="https://github.com/OWASP/www-project-seeker/blob/50d4f86919d0bc6c8c7a4b981be43a81000ba04e/info.md", url="http://somewhere"]; -General -- "OWASP Seeker"; -"OWASP Ctf" [URL="https://github.com/OWASP/www-project-ctf/blob/5638345f11eb2cf8e1bb7a3c26a93f8c7e53be7f/info.md", url="http://somewhere"]; -General -- "OWASP Ctf"; -"OWASP Passfault" [URL="https://github.com/OWASP/www-project-passfault/blob/911fa9c6c3e47b9e759afe87eef8173e02a19784/info.md", url="http://somewhere"]; -General -- "OWASP Passfault"; -"OWASP Python Honeypot" [URL="https://github.com/OWASP/www-project-python-honeypot/blob/bbe864b11a80bd73156ee364e58ccf956f3b1fcc/info.md", url="http://somewhere"]; -General -- "OWASP Python Honeypot"; -"OWASP Drill" [URL="https://github.com/OWASP/www-project-drill/blob/ba5b9be78e7c3b21f393c7792b43df3ee1a06360/info.md", url="http://somewhere"]; -General -- "OWASP Drill"; -"OWASP Automotive EMB 60" [URL="https://github.com/OWASP/www-project-automotive-emb-60/blob/82f43f88158fed80b36ba0347b1820fc7bf37186/info.md", url="http://somewhere"]; -General -- "OWASP Automotive EMB 60"; -"OWASP SEDATED®" [URL="https://github.com/OWASP/www-project-sedated/blob/6772f8e3e8bd13e7949fc2309bf9d08299d264e6/info.md", url="http://somewhere"]; -General -- "OWASP SEDATED®"; -"OWASP Snakes And Ladders" [URL="https://github.com/OWASP/www-project-snakes-and-ladders/blob/b6a7ad10e7be49ef72ba48c5d4c28b1593ee4af4/info.md", url="http://somewhere"]; -General -- "OWASP Snakes And Ladders"; -"OWASP Information Security Metrics Bank" [URL="https://github.com/OWASP/www-project-information-security-metrics-bank/blob/796146d6d87a78951164908f36a7c2dd9c3e45f7/info.md", url="http://somewhere"]; -General -- "OWASP Information Security Metrics Bank"; -"OWASP Glue Tool" [URL="https://github.com/OWASP/www-project-glue-tool/blob/e0d07697bdce14512adb2b9e427e77e7496a4d3c/info.md", url="http://somewhere"]; -General -- "OWASP Glue Tool"; -"OWASP Php Security Training" [URL="https://github.com/OWASP/www-project-php-security-training/blob/5d3bf6ae4970f77375d47eee823967bc4e73ab0d/info.md", url="http://somewhere"]; -General -- "OWASP Php Security Training"; -"OWASP Watiqay" [URL="https://github.com/OWASP/www-project-watiqay/blob/243867ec8f30c209801e33afd69b54d7a9194cb4/info.md", url="http://somewhere"]; -General -- "OWASP Watiqay"; -"OWASP Machine Learning Security Top 10" [URL="https://github.com/OWASP/www-project-machine-learning-security-top-10/blob/8513772ec536b1cff47b02004b5418fb85d49c6f/info.md", url="http://somewhere"]; -General -- "OWASP Machine Learning Security Top 10"; -"OWASP Damn Vulnerable Crypto Wallet" [URL="https://github.com/OWASP/www-project-damn-vulnerable-crypto-wallet/blob/544410a1cc86097c976da2e1358362649134a5dc/info.md", url="http://somewhere"]; -General -- "OWASP Damn Vulnerable Crypto Wallet"; -"OWASP Ende" [URL="https://github.com/OWASP/www-project-ende/blob/9c43d6f1945fac929ccb3d60dd4b86b9f1a2af46/info.md", url="http://somewhere"]; -General -- "OWASP Ende"; -"OWASP Learning Gateway" [URL="https://github.com/OWASP/www-project-learning-gateway/blob/706e2ea9254c6f118925510df14ddde280900446/info.md", url="http://somewhere"]; -General -- "OWASP Learning Gateway"; -"OWASP Big Data Security Verification Standard" [URL="https://github.com/OWASP/www-project-big-data/blob/edc55fa6b0c9c03f7c6e7693bc387a4fb03a9ddd/info.md", url="http://somewhere"]; -General -- "OWASP Big Data Security Verification Standard"; -"OWASP Pyttacker" [URL="https://github.com/OWASP/www-project-pyttacker/blob/893320c4a8a7ba70936ee230eeca589f300ef0ba/info.md", url="http://somewhere"]; -General -- "OWASP Pyttacker"; -"OWASP Cloud Testing Guide" [URL="https://github.com/OWASP/www-project-cloud-testing-guide/blob/88da2136b72a3fb798b373fd3cdb10b6b61748df/info.md", url="http://somewhere"]; -General -- "OWASP Cloud Testing Guide"; -"OWASP Security Resource Framework" [URL="https://github.com/OWASP/www-project-security-resource-framework/blob/9add030a96f25efcbaf00258388edef824c97361/info.md", url="http://somewhere"]; -General -- "OWASP Security Resource Framework"; -"OWASP Rfp-Criteria" [URL="https://github.com/OWASP/www-project-rfp-criteria/blob/61b36dc570726dbbd8fc03b0ccf8193ceffe4104/info.md", url="http://somewhere"]; -General -- "OWASP Rfp-Criteria"; -"OWASP Intelligent Intrusion Detection System" [URL="https://github.com/OWASP/www-project-intelligent-intrusion-detection-system/blob/94f4170e6a214b4dee7f31a0adc14f1b5f96e755/info.md", url="http://somewhere"]; -General -- "OWASP Intelligent Intrusion Detection System"; -"OWASP Wpbullet" [URL="https://github.com/OWASP/www-project-wpbullet/blob/18bc46df389b95f50e931a6d64b55856c04633f2/info.md", url="http://somewhere"]; -General -- "OWASP Wpbullet"; -"OWASP Vicnum" [URL="https://github.com/OWASP/www-project-vicnum/blob/b0452e5ce3b6279668db3330d476362bc1fd1827/info.md", url="http://somewhere"]; -General -- "OWASP Vicnum"; -"OWASP Security Logging" [URL="https://github.com/OWASP/www-project-security-logging/blob/41edde26a72db0aa20a2df1a54e91c3888f7fdee/info.md", url="http://somewhere"]; -General -- "OWASP Security Logging"; -"OWASP Software Component Verification Standard" [URL="https://github.com/OWASP/www-project-software-component-verification-standard/blob/82fb31ecc020901a765ff31a32b0673ac4ed6d9d/info.md", url="http://somewhere"]; -General -- "OWASP Software Component Verification Standard"; -"OWASP Reverse Engineering And Code Modification Prevention" [URL="https://github.com/OWASP/www-project-reverse-engineering-and-code-modification-prevention/blob/92cd1c6a94192b77e9371728b635aaaf118c0f6d/info.md", url="http://somewhere"]; -General -- "OWASP Reverse Engineering And Code Modification Prevention"; -"OWASP Webspa" [URL="https://github.com/OWASP/www-project-webspa/blob/0bbe9bf22230c6f497733da7c284ca94fe7cc962/info.md", url="http://somewhere"]; -General -- "OWASP Webspa"; -"OWASP Top 10 Card Game" [URL="https://github.com/OWASP/www-project-top-10-card-game/blob/cdf6e5e5d39b8ff61feb1b71914d0b57512c38e2/info.md", url="http://somewhere"]; -General -- "OWASP Top 10 Card Game"; -"OWASP CSRFProtector Project" [URL="https://github.com/OWASP/www-project-csrfprotector/blob/0f573c0497d62cf462c6df90864a2651aa6f64fd/info.md", url="http://somewhere"]; -General -- "OWASP CSRFProtector Project"; -"OWASP Threat Model" [URL="https://github.com/OWASP/www-project-threat-model/blob/898e2e891fcfdef51910b09196b633f5f94244b7/info.md", url="http://somewhere"]; -General -- "OWASP Threat Model"; -"OWASP Single Sign-On" [URL="https://github.com/OWASP/www-project-sso/blob/ba9cb694f6ec16fa4890b36a161194e127747b29/info.md", url="http://somewhere"]; -General -- "OWASP Single Sign-On"; -"OWASP Vbscan" [URL="https://github.com/OWASP/www-project-vbscan/blob/8249d8b193d0f223fa31b852f2c81210b17e1f0d/info.md", url="http://somewhere"]; -General -- "OWASP Vbscan"; -"OWASP Anti-Ransomware Guide" [URL="https://github.com/OWASP/www-project-anti-ransomware-guide/blob/041b1249c4f58e0bad056b1c0f3145b98e4a4d86/info.md", url="http://somewhere"]; -General -- "OWASP Anti-Ransomware Guide"; -"OWASP rat" [URL="https://github.com/OWASP/www-project-rat/blob/527bbb8c507cef1ffa19d8e53e74110e5aabb44d/info.md", url="http://somewhere"]; -General -- "OWASP rat"; -"OWASP Seraphimdroid" [URL="https://github.com/OWASP/www-project-seraphimdroid/blob/de41a08968864a2be0fe80b0c2dc81b3eddae0cc/info.md", url="http://somewhere"]; -General -- "OWASP Seraphimdroid"; -"OWASP Game Security Framework" [URL="https://github.com/OWASP/www-project-game-security-framework/blob/18b8dd08843bb308e3a04255dd8367c4049fe651/info.md", url="http://somewhere"]; -General -- "OWASP Game Security Framework"; -"OWASP Cyber Security Enterprise Operations Architecture" [URL="https://github.com/OWASP/www-project-cyber-security-enterprise-operations-architecture/blob/3bb648672c4450b41fb6647b59b5dd02f2dde6cb/info.md", url="http://somewhere"]; -General -- "OWASP Cyber Security Enterprise Operations Architecture"; -"OWASP Igoat Tool" [URL="https://github.com/OWASP/www-project-igoat-tool/blob/e4db069bf931891cad923607fcd8ddf28879165d/info.md", url="http://somewhere"]; -General -- "OWASP Igoat Tool"; -"OWASP O2 Platform" [URL="https://github.com/OWASP/www-project-o2-platform/blob/fd80b1306313c8512626e53c8a2aaa25ab0ad2c2/info.md", url="http://somewhere"]; -General -- "OWASP O2 Platform"; -"OWASP University Challenge" [URL="https://github.com/OWASP/www-project-university-challenge/blob/2772357846c59f56893ae1938b7564eb836c3422/info.md", url="http://somewhere"]; -General -- "OWASP University Challenge"; -"OWASP internet of things top 10" [URL="https://github.com/OWASP/www-project-internet-of-things-top-10/blob/67b36ad32adf1c2b17191fcf53054861f2bc243c/info.md", url="http://somewhere"]; -General -- "OWASP internet of things top 10"; -"2020 OWASP LATAM Tour" [URL="https://github.com/OWASP/www-event-2020-latam-tour/blob/dfddc7312f9e793644fa0d7c0c71e68d0fe6dbca/info.md", url="http://somewhere"]; -General -- "2020 OWASP LATAM Tour"; -"OWASP Software Security 5D Framework" [URL="https://github.com/OWASP/www-project-software-security-5d-framework/blob/31b45d69ca07503736b46267c93164e59b8c3dc3/info.md", url="http://somewhere"]; -General -- "OWASP Software Security 5D Framework"; -"OWASP TimeGap Theory" [URL="https://github.com/OWASP/www-project-timegap-theory/blob/7addc9483b6b5e27759fd2cedb96e0bf7b3d39de/info.md", url="http://somewhere"]; -General -- "OWASP TimeGap Theory"; -"OWASP Mth3L3M3Nt Framework" [URL="https://github.com/OWASP/www-project-mth3l3m3nt-framework/blob/7b4d739e9607b704827fd0aaaeaa155ab0c60335/info.md", url="http://somewhere"]; -General -- "OWASP Mth3L3M3Nt Framework"; -"OWASP Lock It" [URL="https://github.com/OWASP/www-project-lock-it/blob/de9d1229be737a674afc32cfb5be1224b656c71d/info.md", url="http://somewhere"]; -General -- "OWASP Lock It"; -"OWASP Internet of Things" [URL="https://github.com/OWASP/www-project-internet-of-things/blob/e9c152c001a99e7d861d62c49921a24a72fe23c3/info.md", url="http://somewhere"]; -General -- "OWASP Internet of Things"; -"OWASP AntiSamy" [URL="https://github.com/OWASP/www-project-antisamy/blob/eedb0ccfce07914bde31db64ccdfbd176860645a/info.md", url="http://somewhere"]; -General -- "OWASP AntiSamy"; -"OWASP Java Encoder" [URL="https://github.com/OWASP/www-project-java-encoder/blob/83cc178283814e495fa60df2f074307d9c15b32a/info.md", url="http://somewhere"]; -General -- "OWASP Java Encoder"; -"OWASP Incident Response" [URL="https://github.com/OWASP/www-project-incident-response/blob/2a41f900631c2accf4d03123c50a51bdfdc26846/info.md", url="http://somewhere"]; -General -- "OWASP Incident Response"; -"OWASP Seclists" [URL="https://github.com/OWASP/www-project-seclists/blob/2472c506f266390e2232b7fff86d3b15a2f1bda5/info.md", url="http://somewhere"]; -General -- "OWASP Seclists"; -"OWASP Find Security Bugs" [URL="https://github.com/OWASP/www-project-find-security-bugs/blob/6586040977684d0e7d82965b4329d2c3381773d2/info.md", url="http://somewhere"]; -General -- "OWASP Find Security Bugs"; -"OWASP Top 10 Privacy Risks" [URL="https://github.com/OWASP/www-project-top-10-privacy-risks/blob/6f883f761f121e22295f7eca2e9b814a298603e6/info.md", url="http://somewhere"]; -General -- "OWASP Top 10 Privacy Risks"; -"OWASP WIA, Diversity and Inclusion Committee" [URL="https://github.com/OWASP/www-committee-wia/blob/f9c2b898e9efb40f4d3eb900efb9969f60313bae/info.md", url="http://somewhere"]; -General -- "OWASP WIA, Diversity and Inclusion Committee"; -"OWASP Core Business Application Security" [URL="https://github.com/OWASP/www-project-core-business-application-security/blob/37d0c2ea62aea1b3a0d8a888fb53d7aa4c682e66/info.md", url="http://somewhere"]; -General -- "OWASP Core Business Application Security"; -"OWASP API Security Project" [URL="https://github.com/OWASP/www-project-api-security/blob/9044114b81b332d7bfd78097f2686d3ce13e12c5/info.md", url="http://somewhere"]; -General -- "OWASP API Security Project"; -"OWASP Secure Coding Dojo" [URL="https://github.com/OWASP/www-project-secure-coding-dojo/blob/5c1c41936de9b3f83583c35b5442bc43a2c22415/info.md", url="http://somewhere"]; -General -- "OWASP Secure Coding Dojo"; -"OWASP ASST" [URL="https://github.com/OWASP/ASST/blob/4a232af511baf5b27092a0951be57b59b1c1e9dc/info.md", url="http://somewhere"]; -General -- "OWASP ASST"; -"OWASP Attack Surface Detector" [URL="https://github.com/OWASP/www-project-attack-surface-detector/blob/ae8197d8359d612a0016258e76eab2da4aa55143/info.md", url="http://somewhere"]; -General -- "OWASP Attack Surface Detector"; -"OWASP Application Security Verification Standard" [URL="https://github.com/OWASP/www-project-application-security-verification-standard/blob/73f8add5b16d0524456111e67610aaa28e802e32/info.md", url="http://somewhere"]; -General -- "OWASP Application Security Verification Standard"; -"OWASP Snow" [URL="https://github.com/OWASP/www-project-snow/blob/a73339abafe3ab33148494c46de8f1101a2383b6/info.md", url="http://somewhere"]; -General -- "OWASP Snow"; -"OWASP Security Knowledge Framework" [URL="https://github.com/OWASP/www-project-security-knowledge-framework/blob/498e599d7d1fb94bffed9e2fc7dcf3edb590ee7e/info.md", url="http://somewhere"]; -General -- "OWASP Security Knowledge Framework"; -"OWASP Threat Dragon" [URL="https://github.com/OWASP/www-project-threat-dragon/blob/b3bcd7c828384516b06f15a406c88ea180ac95ee/info.md", url="http://somewhere"]; -General -- "OWASP Threat Dragon"; -"OWASP Threat and Safeguard Matrix (TaSM)" [URL="https://github.com/OWASP/www-project-threat-and-safeguard-matrix/blob/7cdda5abf4320c49a27716c3b12615d39612d15c/info.md", url="http://somewhere"]; -General -- "OWASP Threat and Safeguard Matrix (TaSM)"; -"OWASP Sectudo" [URL="https://github.com/OWASP/www-project-sectudo/blob/b674800e6c99cd0de21502cab2dad49f7745feea/info.md", url="http://somewhere"]; -General -- "OWASP Sectudo"; -"OWASP Appsec Pipeline" [URL="https://github.com/OWASP/www-project-appsec-pipeline/blob/1e5ac93392075a14cf53bef4860030e5646f97e8/info.md", url="http://somewhere"]; -General -- "OWASP Appsec Pipeline"; -"OWASP Cyber Scavenger Hunt" [URL="https://github.com/OWASP/www-project-cyber-scavenger-hunt/blob/1a24f1d6c9b97ca076619d5436f2d8060214d14c/info.md", url="http://somewhere"]; -General -- "OWASP Cyber Scavenger Hunt"; -"OWASP Broken Web Applications" [URL="https://github.com/OWASP/www-project-broken-web-applications/blob/033e090480dfb3564bff5b23a9feae555c3ac7e5/info.md", url="http://somewhere"]; -General -- "OWASP Broken Web Applications"; -"OWASP ZAP" [URL="https://github.com/OWASP/www-project-zap/blob/d5b753cdbae07616a0a5ce74cc60bdb6c291b347/info.md", url="http://somewhere"]; -General -- "OWASP ZAP"; -"OWASP Docker Top 10" [URL="https://github.com/OWASP/www-project-docker-top-10/blob/d6c2f30b50e01066c01df2a82d8f2c5cb7e30bc0/info.md", url="http://somewhere"]; -General -- "OWASP Docker Top 10"; -"OWASP Web Testing Environment" [URL="https://github.com/OWASP/www-project-web-testing-environment/blob/6fe562cb6f32eac226c3ff046e6c2b0bb6eda9bd/info.md", url="http://somewhere"]; -General -- "OWASP Web Testing Environment"; -"OWASP Automated Threats to Web Applications" [URL="https://github.com/OWASP/www-project-automated-threats-to-web-applications/blob/50097064c7b414bd26ea01d1acb43c192f24777b/info.md", url="http://somewhere"]; -General -- "OWASP Automated Threats to Web Applications"; -"OWASP Code Pulse" [URL="https://github.com/OWASP/www-project-code-pulse/blob/0d444805283e030f6f70112728c5da93ad74d664/info.md", url="http://somewhere"]; -General -- "OWASP Code Pulse"; -"OWASP Mobile Top 10" [URL="https://github.com/OWASP/www-project-mobile-top-10/blob/1afcfbd312537d8e9f1c0cceecbb878248601f19/info.md", url="http://somewhere"]; -General -- "OWASP Mobile Top 10"; -"OWASP Code Review Guide" [URL="https://github.com/OWASP/www-project-code-review-guide/blob/6873564248bdb940b1648488740c79433099977f/info.md", url="http://somewhere"]; -General -- "OWASP Code Review Guide"; -"OWASP Threat Model Cookbook" [URL="https://github.com/OWASP/www-project-threat-model-cookbook/blob/8f9ac9ac00ad89de5274e999ab6281ab23eb63a5/info.md", url="http://somewhere"]; -General -- "OWASP Threat Model Cookbook"; -"OWASP Proactive Controls" [URL="https://github.com/OWASP/www-project-proactive-controls/blob/141400b985483f81a83beffdb7a936b9593d70ab/info.md", url="http://somewhere"]; -General -- "OWASP Proactive Controls"; -"OWASP Security Qualitative Metrics" [URL="https://github.com/OWASP/www-project-security-qualitative-metrics/blob/1b9e80040255684b8220f3dfe1f78e433ff133d2/info.md", url="http://somewhere"]; -General -- "OWASP Security Qualitative Metrics"; -"OWASP Security Busters" [URL="https://github.com/OWASP/www-project-security-busters/blob/b5a7cdeff65f22c2c012509821d3dc00d26fce1d/info.md", url="http://somewhere"]; -General -- "OWASP Security Busters"; -"OWASP Scan IT" [URL="https://github.com/OWASP/www-project-scan-it/blob/eecb1111c5a26e3c7efc58080caa92fe6e417bde/info.md", url="http://somewhere"]; -General -- "OWASP Scan IT"; -"OWASP Iot Analytics 4Industry4" [URL="https://github.com/OWASP/www-project-iot-analytics-4industry4/blob/320528a09a671fab84f103a10c3a20eebbd094a7/info.md", url="http://somewhere"]; -General -- "OWASP Iot Analytics 4Industry4"; -"OWASP Embedded Application Security" [URL="https://github.com/OWASP/www-project-embedded-application-security/blob/9ae4dccc21bc57ccd7e165ddc3234d01249e0800/info.md", url="http://somewhere"]; -General -- "OWASP Embedded Application Security"; -"OWASP Secure Coding Practices-Quick Reference Guide" [URL="https://github.com/OWASP/www-project-secure-coding-practices-quick-reference-guide/blob/6a1cf2373ba883ec6047435381a6cbc96db3c1f6/info.md", url="http://somewhere"]; -General -- "OWASP Secure Coding Practices-Quick Reference Guide"; -"OWASP Cheat Sheet Series" [URL="https://github.com/OWASP/www-project-cheat-sheets/blob/07888b59740203e2dc3dd0ad11c1b63d02e2fafc/info.md", url="http://somewhere"]; -General -- "OWASP Cheat Sheet Series"; -"OWASP Pygoat" [URL="https://github.com/OWASP/www-project-pygoat/blob/707e5043fdae3073f7832fee09fc264f9f8da1e8/info.md", url="http://somewhere"]; -General -- "OWASP Pygoat"; -"OWASP Secure Headers Project" [URL="https://github.com/OWASP/www-project-secure-headers/blob/3e4d0e89843935d4981238bbbd18acca33e9237a/info.md", url="http://somewhere"]; -General -- "OWASP Secure Headers Project"; -"OWASP CWE Toolkit" [URL="https://github.com/OWASP/www-project-cwe-toolkit/blob/db564f4b7f374d953d4aacb246022639cfc6f122/info.md", url="http://somewhere"]; -General -- "OWASP CWE Toolkit"; -"OWASP Patton" [URL="https://github.com/OWASP/www-project-patton/blob/074821dc0d1510f88a8ef8908b95e7236548cd4e/info.md", url="http://somewhere"]; -General -- "OWASP Patton"; -"OWASP Security Shepherd" [URL="https://github.com/OWASP/www-project-security-shepherd/blob/5e4983d3ba63ca4cf5a7ed49ba0281ce07cfa498/info.md", url="http://somewhere"]; -General -- "OWASP Security Shepherd"; -"OWASP Kubernetes Security Testing Guide" [URL="https://github.com/OWASP/www-project-kubernetes-security-testing-guide/blob/c09d71ddeafe9e2c2f0943d8ed615e1d93a65b33/info.md", url="http://somewhere"]; -General -- "OWASP Kubernetes Security Testing Guide"; -"OWASP Damn Vulnerable Thick Client Application" [URL="https://github.com/OWASP/www-project-damn-vulnerable-thick-client-application/blob/ef90a81e9481cd6d15caa173e3b9ff0080de6ade/info.md", url="http://somewhere"]; -General -- "OWASP Damn Vulnerable Thick Client Application"; -"OWASP Media" [URL="https://github.com/OWASP/www-project-media-archive/blob/2a7bb7e388c3cafe5a17b4a2e9cabef9c1071291/info.md", url="http://somewhere"]; -General -- "OWASP Media"; -"OWASP SAMM" [URL="https://github.com/OWASP/www-project-samm/blob/39ae59a980a01f942a3880f434be4435650fb9a7/info.md", url="http://somewhere"]; -General -- "OWASP SAMM"; -"OWASP TorBot" [URL="https://github.com/OWASP/www-project-torbot/blob/9a9ef17fc6dbe056eb74341311a02f7a24c0e0f7/info.md", url="http://somewhere"]; -General -- "OWASP TorBot"; -"OWASP AndroGoat" [URL="https://github.com/OWASP/www-project-androgoat/blob/c880e96b5b9ed927e8c0806d6ff2ebe69ec0ab02/info.md", url="http://somewhere"]; -General -- "OWASP AndroGoat"; -"OWASP Cyber Controls Matrix (OCCM)" [URL="https://github.com/OWASP/www-project-cyber-controls-matrix/blob/08932c680c69104e8edf3394e86c76ff8d791b20/info.md", url="http://somewhere"]; -General -- "OWASP Cyber Controls Matrix (OCCM)"; -"OWASP Joomscan" [URL="https://github.com/OWASP/www-project-joomscan/blob/7093aaeba5e384e138eb9c057c55a9fdc8c29e87/info.md", url="http://somewhere"]; -General -- "OWASP Joomscan"; -"OWASP Devsecops Maturity Model" [URL="https://github.com/OWASP/www-project-devsecops-maturity-model/blob/b07ad6d67835b976248896f252f3871c08a1a605/info.md", url="http://somewhere"]; -General -- "OWASP Devsecops Maturity Model"; -"OWASP Benchmark" [URL="https://github.com/OWASP/www-project-benchmark/blob/ca5c049504029423c109443a29d81954a091213f/info.md", url="http://somewhere"]; -General -- "OWASP Benchmark"; -"OWASP Mobile Security Testing Guide" [URL="https://github.com/OWASP/www-project-mobile-security-testing-guide/blob/e28d4bd936cfbe8688351c653a4ae0eed780638a/info.md", url="http://somewhere"]; -General -- "OWASP Mobile Security Testing Guide"; -"OWASP Node.js Goat" [URL="https://github.com/OWASP/www-project-node.js-goat/blob/644671ef86afcb0a9658fdbddb409bb346683e24/info.md", url="http://somewhere"]; -General -- "OWASP Node.js Goat"; -"OWASP WebGoat" [URL="https://github.com/OWASP/www-project-webgoat/blob/4fb23f832a20205265260b18e7c11d895515f35b/info.md", url="http://somewhere"]; -General -- "OWASP WebGoat"; -"OWASP Security Pins" [URL="https://github.com/OWASP/www-project-security-pins/blob/dc2f1b08ef35a659c29517f26ea6a084aab1633b/info.md", url="http://somewhere"]; -General -- "OWASP Security Pins"; -"OWASP ASVS-Graph" [URL="https://github.com/OWASP/www-project-asvs-graph/blob/e62d108b2cb74ce15c88ba5ca705a61dde6dec49/info.md", url="http://somewhere"]; -General -- "OWASP ASVS-Graph"; -"OWASP pytm" [URL="https://github.com/OWASP/www-project-pytm/blob/2c221c5c3fc612d6d7a5092758c4514d38b87480/info.md", url="http://somewhere"]; -General -- "OWASP pytm"; -"OWASP Threat Modeling Playbook (OTMP)" [URL="https://github.com/OWASP/www-project-threat-modeling-playbook/blob/ebd7b0d390cdf17e93782399f32d91707946e821/info.md", url="http://somewhere"]; -General -- "OWASP Threat Modeling Playbook (OTMP)"; -"OWASP Cloud-Native Security Project" [URL="https://github.com/OWASP/www-project-cloud-native-security-project/blob/3bf26593f6e7ce4b4d639b11f2209a2f9151a4a9/info.md", url="http://somewhere"]; -General -- "OWASP Cloud-Native Security Project"; -"OWASP CSRFGuard" [URL="https://github.com/OWASP/www-project-csrfguard/blob/b67a2c09427ac3ebe662e341ad778baef6eebacb/info.md", url="http://somewhere"]; -General -- "OWASP CSRFGuard"; -"OWASP Serverless Top 10" [URL="https://github.com/OWASP/www-project-serverless-top-10/blob/dac05abef2b9c6d34c225aa416e41547494aa7e7/info.md", url="http://somewhere"]; -General -- "OWASP Serverless Top 10"; -"OWASP Cloud Security Testing Guide" [URL="https://github.com/OWASP/www-project-cloud-security-testing-guide/blob/a47de50e75550377174c816cf3e1b1c8d90aa69f/info.md", url="http://somewhere"]; -General -- "OWASP Cloud Security Testing Guide"; -"OWASP secureCodeBox" [URL="https://github.com/OWASP/www-project-securecodebox/blob/e33888dfe8d29ea2df9201034d6547ac2eb48c9a/info.md", url="http://somewhere"]; -General -- "OWASP secureCodeBox"; -"OWASP Dependency-Track" [URL="https://github.com/OWASP/www-project-dependency-track/blob/81014d47dc9746c91d40ba2f10ec13569da6ca91/info.md", url="http://somewhere"]; -General -- "OWASP Dependency-Track"; -"OWASP Web Security Testing Guide" [URL="https://github.com/OWASP/www-project-web-security-testing-guide/blob/ede88148f987386960cfaffbda8a33c088c2e538/info.md", url="http://somewhere"]; -General -- "OWASP Web Security Testing Guide"; -"OWASP Thick Client Top 10 Project" [URL="https://github.com/OWASP/www-project-thick-client-top-10/blob/9da8e239544335917529dbf6d582b57e3ca032f3/info.md", url="http://somewhere"]; -General -- "OWASP Thick Client Top 10 Project"; -"OWASP Cyber Defense Matrix" [URL="https://github.com/OWASP/www-project-cyber-defense-matrix/blob/fc7df17171c8742ca96803ddee5af588138fed62/info.md", url="http://somewhere"]; -General -- "OWASP Cyber Defense Matrix"; -"OWASP Android Security Inspector Toolkit" [URL="https://github.com/OWASP/www-project-android-security-inspector-toolkit/blob/9c5a75a216ea7fe73a6faf069f4bf127f732e755/info.md", url="http://somewhere"]; -General -- "OWASP Android Security Inspector Toolkit"; -"OWASP SecureBank" [URL="https://github.com/OWASP/www-project-securebank/blob/a0023a38fad70afef46772a9f2b303322b6b4ff9/info.md", url="http://somewhere"]; -General -- "OWASP SecureBank"; -"OWASP SamuraiWTF" [URL="https://github.com/OWASP/www-project-samuraiwtf/blob/cf3ba6dc831de75e132ec4605e56727cf2eac1a6/info.md", url="http://somewhere"]; -General -- "OWASP SamuraiWTF"; -"OWASP Project Committee" [URL="https://github.com/OWASP/www-committee-project/blob/094800edac750fa8ea4ec238c0a8392c85e0ff06/info.md", url="http://somewhere"]; -General -- "OWASP Project Committee"; -"OWASP Integration Standards" [URL="https://github.com/OWASP/www-project-integration-standards/blob/33ab7306c168ca1066688ed5b7d36c3330dac840/info.md", url="http://somewhere"]; -General -- "OWASP Integration Standards"; -"OWASP APICheck" [URL="https://github.com/OWASP/www-project-apicheck/blob/57b36870f7dc3f932beb6eace059f22b348396da/info.md", url="http://somewhere"]; -General -- "OWASP APICheck"; -"OWASP Outreach Committee" [URL="https://github.com/OWASP/www-committee-outreach/blob/b6c119cc6be3177d7378d158f7eee337d134f595/info.md", url="http://somewhere"]; -General -- "OWASP Outreach Committee"; -"Policies & Procedures" [URL="https://github.com/OWASP/www-policy/blob/4dd4905fd763588a2f0a0fbae95d059bb2d32ce5/info.md", url="http://somewhere"]; -General -- "Policies & Procedures"; -"OWASP Top Ten" [URL="https://github.com/OWASP/www-project-top-ten/blob/09b186aaa1adf3fed0e9d049f14431971f2e395e/info.md", url="http://somewhere"]; -General -- "OWASP Top Ten"; -"OWASP Java HTML Sanitizer" [URL="https://github.com/OWASP/www-project-java-html-sanitizer/blob/43a4d51ff67673d8553673748204b504dae671a8/info.md", url="http://somewhere"]; -General -- "OWASP Java HTML Sanitizer"; -"OWASP Nettacker" [URL="https://github.com/OWASP/www-project-nettacker/blob/7ee4c7b385112fb9e1563b2ef1ad5cc43b623703/info.md", url="http://somewhere"]; -General -- "OWASP Nettacker"; -"Global Board" [URL="https://github.com/OWASP/www-board/blob/b7ac4e874d94146e085a325fbf3f0928ebe7a866/info.md", url="http://somewhere"]; -General -- "Global Board"; -"OWASP Community Pages" [URL="https://github.com/OWASP/www-community/blob/3a186346187907a90d15016a32ed512a15574d20/info.md", url="http://somewhere"]; -General -- "OWASP Community Pages"; -"OWASP Cornucopia" [URL="https://github.com/OWASP/www-project-cornucopia/blob/3153aeeb427466ab1a76eab2311a6d73846e24f3/info.md", url="http://somewhere"]; -General -- "OWASP Cornucopia"; -"2020 Global Board Candidates" [URL="https://github.com/OWASP/www-board-candidates/blob/142d74974b4c5877a0a85afc75fbd7f3cebbd2ae/info.md", url="http://somewhere"]; -General -- "2020 Global Board Candidates"; -"OWASP Forensics Testing Guide" [URL="https://github.com/OWASP/www-project-forensics-testing-guide/blob/e8b07d7e92ec5a914c2d75be8174646f46bf5b4c/info.md", url="http://somewhere"]; -General -- "OWASP Forensics Testing Guide"; -Planning; -sdlc -- Planning; -Analysis; -sdlc -- Analysis; -Design; -sdlc -- Design; -Implementation; -sdlc -- Implementation; -Maintenance; -sdlc -- Maintenance; -Strategy; -sdlc -- Strategy; -Culture; -sdlc -- Culture; -} diff --git a/scripts/owasp_graph/owasp_project_metadata_mindmap_gen.py b/scripts/owasp_graph/owasp_project_metadata_mindmap_gen.py deleted file mode 100644 index 83cf13e1a..000000000 --- a/scripts/owasp_graph/owasp_project_metadata_mindmap_gen.py +++ /dev/null @@ -1,347 +0,0 @@ -import requests -import pydot -import os -import yaml -import sys -import base64 -import time -import argparse -import json -import re -import github3 -import logging -from collections import namedtuple -from pprint import pprint -from random import randint -# from github3 import GitHub -from urllib.parse import urlparse -from itertools import chain -from sqlalchemy import Column, Integer, String, create_engine, orm -from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.orm import sessionmaker - - -session = requests.Session() -logger = logging.getLogger(__name__) -logger.setLevel(logging.DEBUG) -Base = declarative_base() - - -class Info(Base): - __tablename__ = 'info' - - name = Column(String, default='Unnamed Project', primary_key=True) - repository = Column(String) - level = Column(Integer, default=0) - type = Column(String) - pitch = Column(String) - audience = Column(String) - social = Column(String) - example_usage = Column(String) - output_type = Column(String) - tags = Column(String) - sdlc = Column(String) - - tags_arr = [] - sdlc_arr = [] - - def __init__(self, - name: str, - repository: str, - level: int, - type: str, - pitch: str, - audience: str, - social: str, - example_usage="", - output_type="", - tags=[], - sdlc=[]): - self.name = name - self.repository = repository - self.level = level - self.type = type - self.pitch = pitch - self.audience = audience - self.social = social - self.example_usage = example_usage - self.output_type = output_type - - if isinstance(tags, list): - self.tags = ", ".join(tags) - self.tags_arr = tags - else: - self.tags = tags - if "," in tags: - self.tags_arr = tags.split(",") - else: - self.tags_arr = [tags] - - if len(sdlc) == 0: - logger.debug('sdlc 0 setting default') - self.sdlc = "General" - self.sdlc_arr = [self.sdlc] - elif isinstance(sdlc, list): - self.sdlc = ", ".join(sdlc) - self.sdlc_arr = sdlc - else: - self.sdlc = sdlc - if "," in sdlc: - self.sdlc_arr = sdlc.split(",") - else: - self.sdlc_arr = [sdlc] - - @orm.reconstructor - def init_on_load(self): - self.tags_arr = self.tags.split(", ") - self.sdlc_arr = self.sdlc.split(", ") - - -class Mindmap: - info_arr: [] - cache: bool - cache_file: str - metadata_dict = {"General": [], - "Planning": [], - "Analysis": [], - "Design": [], - "Implementation": [], - "Maintenance": [], - "Strategy": [], - "Culture": []} - - def __init__(self, cache: bool = False, cache_file: str = None): - self.info_arr = list() - self.cache = cache - self.cache_file = cache_file - - if cache: - self.connect() - self.load() - - def connect(self): - connection = create_engine('sqlite:///'+self.cache_file, echo=False) - Session = sessionmaker(bind=connection) - self.session = Session() - Base.metadata.bind = connection - - if not connection.dialect.has_table(connection, Info.__tablename__): - Base.metadata.create_all(connection) - - def load(self): - """ loads cache into memory - """ - cache = self.session.query(Info) - for info in cache: - for sd in info.sdlc.split(", "): - self.metadata_dict[sd].append(info.__dict__) - - def add(self, info: Info): - self.info_arr.append(info) - for sd in info.sdlc_arr: - self.metadata_dict[sd].append(info.__dict__) - - if self.cache: - self.update_cache(info) - - def update_cache(self, info: Info): - """ - - """ - cache_entry = self.session.query(Info).filter( - Info.name == info.name).first() - if cache_entry is not None: - # logger.debug("knew of %s ,updating"%cache_entry.name) - cache_entry = info - else: - # logger.debug("did not know of %s ,adding"%info.name) - self.session.add(info) - - self.session.commit() - - - - -def extract_index_meta(index: str): - """ - uses regexp to extract information from index.md metadata - arg: index:str content of idnex.md - returns: quintuple - """ - regexp = {'title': '(title: (?P.+))', - 'tags': '(tags: (?P<tags>.+))', - 'level': '(level: (?P<level>.+))', - 'type': '(type: (?P<type>.+))', - 'pitch': ' (pitch: (?P<pitch>.+))'} - results = {} - metadata = re.search("---.*---", index, re.DOTALL) - title = tags = level = type = pitch = "" - if metadata is not None: - for k, v in regexp.items(): - m = re.search(v, metadata.group()) - if m is not None: - results[k] = m.group(k).strip() - else: - results[k] = '' - return (results['title'], - results['tags'], - results['level'], - results['type'], - results['pitch']) - else: - logger.warning('failed to match header') - logger.error("regexp bug, could not parse "+index) - return (None, None, None, None, None) - - -def extract_info_meta(info: str): - # TODO: parse info.md which is unstructured html/markdown - return None, None, None - - -def extract_config_meta(config: str): - # TODO: parse _config.yml when we start adding useful info in there - return None - - -def get_project_meta(project_url: str,source_base:str)->Info: - """ parse: - * index.md for the string between the "---" tags in order to extract title, tags, level, type and pitch - * info.md to extract audience, social links and code repo - args: project_url github url to a project - args: source_base url pointing to html version of the source - returns: Info object - """ - if project_url.endswith(".md"): - logger.error("You have a bug, get_project_meta(project_url) takes a url that ends in / without the file ") - if not project_url.endswith("/"): - project_url = project_url + "/" - logger.debug("added trailing slash") - - index_url = project_url + "index.md" - index_file = session.get(index_url).json() - index_content = base64.b64decode(index_file['content']).decode('utf-8') - title, tags, level, type, pitch = extract_index_meta(index_content) - - info_url = project_url + "info.md" - info_file = session.get(info_url).json() - info_content = base64.b64decode(index_file['content']).decode('utf-8') - audience, social, code = extract_info_meta(info_content) - - project_info = Info(name=title, - repository=code or source_base, - tags=tags, - level=level, - type=type, - pitch=pitch, - audience=audience, - social=social) - return project_info - - -def gather_org_metadata(reponame: str, orgname: str, cache: str) -> Mindmap: - """ - Builds the repo object for every repo in the org - :param reponame if not None, it will search only for the specific repo - :param orgname if not None, it will search only for the specific org - :returns Metadata object, containing list of dicts representing the files - """ - logger.debug("gathering metadata for "+orgname) - result = Mindmap(cache=True, cache_file=cache) - connection = github3.GitHub() - - query = 'filename:"info.md" path:/' - if reponame is not None: - search = f"repo:{reponame} {query}" - elif orgname is not None: - search = f"org:{orgname} {query}" - metadata = connection.search_code(search) - - for f in metadata: - time.sleep(1) # throttle locally so github doesn't complain - content = session.get(f.url) - logger.debug("processing: "+f.url) - if content.status_code == 200: - resp = json.loads(content.text) - logger.info(f"analysing data for {resp['_links']['html']}") - - if "chapter" in resp['_links']['html'].lower(): # skip chapter pages - logger.info(resp['_links']['html'].lower() + - " is a chapter, skipping for now") - continue - - # extract project base so we can get both index and info - project_base = re.sub( - r'\?ref=.*', "", resp['url']).replace("info.md", "") - result.add(get_project_meta(project_base,source_base=resp['_links']['html'].replace("info.md",""))) - else: - logger.error(f"ERROR response code: {content.status_code}") - return result - - -def build_metadata(org_dict: dict, repo_dict: dict, cache: str) -> list: - """ searches for info.yaml in the repo or the org defined - finds the info.yaml metadata files and fetches them - returns object representation of metadata files groupped by sdlc step - """ - for human_org_name, github_org_name in org_dict.items(): - logger.debug("Processing %s:%s" % (human_org_name, github_org_name)) - data = gather_org_metadata( - reponame=None, orgname=github_org_name, cache=cache) - - # TODO: when there's a use case for individual repos, uncomment - # for human_repo_name,github_repo_name in repo_dict.items(): - # logger.debug(f"Processing {human_repo_name}") - # mindmap = enhance_metadata(orgname=None, reponame=github_repo_name,metadata=mindmap) - return data - -def add(graph, parent_node:str, child:str,**kwargs): - - if kwargs.get('url'): - node = pydot.Node(child) - # print('setting url %s'%kwargs.get('url')) - node.set_URL(kwargs.get('url')) - else: - node = pydot.Node(child) - edge = pydot.Edge(parent_node, node) - # pprint(node.get_URL()) - - graph.add_node(node) - graph.add_edge(edge) - - -def build_graph(metadata: Mindmap) -> pydot.Dot: - graph = pydot.Dot(graph_type="graph", rankdir="LR") - for sdlc_step, projects in metadata.metadata_dict.items(): - add(graph, parent_node="sdlc",child=sdlc_step) - for project in projects: - add(graph, parent_node=sdlc_step, child=project.get("name"),url=project.get('repository')) - return graph - - -if __name__ == "__main__": - - # {"testOrgForMetadataScript":"testOrgForMetadataScript"} this should eventually be a yaml file or some other easily parsable file mapping repos to projects - orgs = {"owasp": "OWASP", "zap": "zap"} - repos = {} # {"standaloneTestRepo1":"northdpole/standaloneTestRepo1","standaloneTestRepo2":"northdpole/standaloneTestRepo2"} - - parser = argparse.ArgumentParser( - description='Build an owasp projects graph') - parser.add_argument( - '--from_cache', help='use the cache file instead of doing requests') - args = parser.parse_args() - - if args.from_cache: - metadata = Mindmap(cache=True, cache_file=args.from_cache) - else: - session.auth = (os.environ.get('GITHUB_USERNAME'), - os.environ.get('GITHUB_TOKEN')) - metadata = build_metadata( - org_dict=orgs, repo_dict=repos, cache="script_cache.sqlite") - - graph = build_graph(metadata) - - graph.write("map.dot") - graph.write_pdf("map.pdf") - graph.write_svg("map.svg") - # os.stat("map.png") diff --git a/scripts/owasp_graph/owasp_project_metadata_mindmap_gen_test.py b/scripts/owasp_graph/owasp_project_metadata_mindmap_gen_test.py deleted file mode 100644 index 0cb9532e1..000000000 --- a/scripts/owasp_graph/owasp_project_metadata_mindmap_gen_test.py +++ /dev/null @@ -1,98 +0,0 @@ -from github3 import GitHub -import unittest -import pydot -from owasp_project_metadata_mindmap_gen import build_graph, build_metadata,Info, gather_metadata -from tempfile import mktemp -from pprint import pprint -from unittest.mock import patch -from collections import namedtuple - -class TestProjMetadataParsers(unittest.TestCase): - - def setUp(self): - self.data ={'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA': [{"name": "northdpole/testRepo2", - "repository": "https://github.com/northdpole/standaloneTestRepo1", - "tags": ["defenders", "foo", "bar"], - "sdlc": ["AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "Cooking"], - "example_usage": "get hammer -> smash drives -> ignite thermite", - "output_type": ["smashed drives"]}], - 'Analysis': [{"name": "testOrg/testRepo1", - "repository": "https://github.com/testOrgForMetadataScript/testRepo1", - "tags": ["builders", "foo", "bar"], - "sdlc": ["Analysis", "Implementation"], - "example_usage": "https://demo.testOrg.testRepo1.org", - "output_type": ["urls", "guidelines"]}, - {"name": "testOrg/testRepo2", - "repository": "https://github.com/testOrgForMetadataScript/testRepo2", - "tags": ["breakers", "positive", "test"], - "sdlc": ["Analysis", "Culture"], - "example_usage": "docker run -v /tmp:/tmp foobar:v1.3", - "output_type": ["type"]}], - 'Cooking': [{"name": "northdpole/testRepo2", - "repository": "https://github.com/northdpole/standaloneTestRepo1", - "tags": ["defenders", "foo", "bar"], - "sdlc": ["AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "Cooking"], - "example_usage": "get hammer -> smash drives -> ignite thermite", - "output_type": ["smashed drives"]}], - 'Culture': [{"name": "testOrg/testRepo2", - "repository": "https://github.com/testOrgForMetadataScript/testRepo2", - "tags": ["breakers", "positive", "test"], - "sdlc": ["Analysis", "Culture"], - "example_usage": "docker run -v /tmp:/tmp foobar:v1.3", - "output_type": ["type"]}], - 'Design': [], - 'Implementation': [{"name": "testOrg/testRepo1", - "repository": "https://github.com/testOrgForMetadataScript/testRepo1", - "tags": ["builders", "foo", "bar"], "sdlc": ["Analysis", "Implementation"], - "example_usage": "https://demo.testOrg.testRepo1.org", - "output_type": ["urls", "guidelines"]}], - - 'Maintenance': [], - 'Planning': [], - 'Strategy': [{"name": "northdpole/standaloneTestRepo2", - "repository": "https://github.com/northdpole/standaloneTestRepo2", - "tags": ["builders", "positive", "test"], - "sdlc": ["Strategy"], - "example_usage": "kubectl delete po --all --all-namespaces", - "output_type": ["destruction"]}]} - - self.metadata = {} - for k, vals in self.data.items(): - self.metadata[k] = [] - for v in vals: - self.metadata[k].append(Info(v)) - - def test_build_graph(self): - self.maxDiff= None - test_graph = build_graph(self.metadata) - tmp_graph = mktemp() - test_graph.write(tmp_graph) - - with open("test_data/map.dot") as f1, open(tmp_graph) as f2: - graph = f1.read() - generated_graph = f2.read() - - self.assertEqual(graph,generated_graph) - - @patch('owasp_project_metadata_mindmap_gen.enhance_metadata') - def test_build_metadata(self,mocked_enhance): - mocked_enhance.return_value = self.metadata - org_dict = {"testOrgForMetadataScript":"testOrgForMetadataScript","owasp":"owasp", "zap":"zap"} - repo_dict = {"standaloneTestRepo1":"northdpole/standaloneTestRepo1","standaloneTestRepo2":"northdpole/standaloneTestRepo2"} - - self.assertEqual(self.metadata, build_metadata(org_dict,repo_dict)) - - @patch('') - def test_get_project_meta(self,patched_github): - pass - - def test_extract_index_meta(self): - pass - - @unittest.skip('todo') - def test_enhance_metadata(self): - pass - - -if __name__ == '__main__': - unittest.main() \ No newline at end of file diff --git a/scripts/owasp_graph/requirements.txt b/scripts/owasp_graph/requirements.txt deleted file mode 100644 index 2065ea7ec..000000000 --- a/scripts/owasp_graph/requirements.txt +++ /dev/null @@ -1,40 +0,0 @@ -appdirs==1.4.3 -autopep8==1.5.4 -CacheControl==0.12.6 -certifi==2019.11.28 -cffi==1.14.4 -chardet==3.0.4 -colorama==0.4.3 -contextlib2==0.6.0 -cryptography==3.3.1 -Deprecated==1.2.10 -distlib==0.3.0 -distro==1.4.0 -github3.py==1.3.0 -html5lib==1.0.1 -idna==2.8 -ipaddr==2.2.0 -jwcrypto==0.8 -lockfile==0.12.2 -msgpack==0.6.2 -packaging==20.3 -pep517==0.8.2 -progress==1.5 -pycodestyle==2.6.0 -pycparser==2.20 -pydot==1.4.1 -PyGithub==1.54.1 -PyJWT==1.7.1 -pyparsing==2.4.6 -python-dateutil==2.8.1 -pytoml==0.1.21 -PyYAML==5.3.1 -requests==2.22.0 -retrying==1.3.3 -six==1.14.0 -SQLAlchemy==1.3.22 -toml==0.10.2 -uritemplate==3.0.1 -urllib3==1.25.8 -webencodings==0.5.1 -wrapt==1.12.1 diff --git a/scripts/owasp_graph/test_data/map.dot b/scripts/owasp_graph/test_data/map.dot deleted file mode 100644 index 0fc35bdb8..000000000 --- a/scripts/owasp_graph/test_data/map.dot +++ /dev/null @@ -1,19 +0,0 @@ -graph G { -rankdir=UD; -sdlc -- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -- "northdpole/testRepo2"; -sdlc -- Analysis; -Analysis -- "testOrg/testRepo1"; -Analysis -- "testOrg/testRepo2"; -sdlc -- Cooking; -Cooking -- "northdpole/testRepo2"; -sdlc -- Culture; -Culture -- "testOrg/testRepo2"; -sdlc -- Design; -sdlc -- Implementation; -Implementation -- "testOrg/testRepo1"; -sdlc -- Maintenance; -sdlc -- Planning; -sdlc -- Strategy; -Strategy -- "northdpole/standaloneTestRepo2"; -}