Introduction
Hi, I am a data practitioner with experience in various data-related areas (data engineering, data analysis, data science, machine learning) and business domains (customer support, customer success, product, marketing, personalization, and sales).
I am an independent Python user, who is also proficient in multiple databases querying languages/dialects (PostgreSQL, MySQL, Snowflake, Standard SQL in BigQuery) with experience in areas ranging from data collection through its wrangling, modeling, description, and visualisation to the machine learning techniques and models (XGBoost, KMs, Word2vec).
Lately, I have gained experience with data science techniques (like segmentation or recommendation engines) and LLMs in the industry context and data engineering areas (ETL, data models, data architecture).
Data Engineer
Make, Prague, Czech Republic, 12/2022-present
- Data engineering. Development and implementation of
the CD/CI pipeline for Keboola using kb-cli, GitHub, and GitHub Actions.
Building ELT pipelines and data modelling. Building custom Extract/Load
components for various Sales/CRM platforms (Celonis, ZoomInfo) using the
request library. Addressing data quality. Code reviewing. DataOps and
FinOps. Airflow, Amazon Managed Workflows for Apache Airflow. Data
Quality using Soda.
- Machine Learning. Deploying data science projects
(LTV or personas) into production. MLOps. Strategy for the ML
infrastructure development. Code reviewing.
- Generally used tools. Python 3.11+, Snowflake, Airflow, AWS, Github,
Make, Confluence, Slack, Jira
Machine Learning Engineer
Ataccama, Prague, Czech Republic, 07/2022-10/2022
- As a part of the Data Stories team, I contributed to the back-end
(idiomatic and pydantic-driven Python, FAST API) and front-end
(TypeScript, Vue.js) codebases. The use-cases included user-defined
filters or charts and attributes recommendation.
- Unit testing via pytest (including contribution to the CI/CD
pipeline). Git using Gitlab. Linting using black, isort, and flake8.
Docker, Kubernetes, kustomize and Helm.
- Data analytics and data science - prototyping via Jupyter
Notebooks.
- Generally used tools. Python 3.10, Snowflake, MySQL, REST API, Jira,
Notion.
Data & Machine Learning Engineer
CloudTalk, Prague, Czech Republic, 04/2022-06/2022
- Data engineering. Development and implementation of
the CD/CI pipeline for Keboola using kb-cli, GitHub, and GitHub Actions.
Building ELT pipelines and data modelling. Building custom Extract/Load
components for various Sales/CRM platforms (HubSpot, Crunchbase, Apollo)
using the request library. Addressing data quality topics like entity
profiling. Code reviewing.
- Machine Learning. Developing anti-fraud prediction
models. Defined business logic with stakeholders and setting up
alerting. Implementing cookiecutter framework for developing data
science projects. Prepared a strategy for the ML infrastructure
development. Code reviewing.
- Data analytics. Ad hoc reports using Jupyter
Notebooks and Redash.
- Generally used tools. Python 3, Snowflake, ML Flow,
MySQL, REST API, Jira, Outline.
Interim Product Owner of Personalization
Rohlik Group, Prague, Czech Republic, 09/2021-03/2022
- Distributed leadership of the 4-member team (a
back-end developer, a tester, a data analyst, a machine-learning
engineer). Setting a roadmap, agile ceremonies (planning, grooming,
retrospectives, etc.).
- Feature Lifecycle Management - collecting and
prioritising business requirements based on their alignment with the
company’s business goals. Alignment with other relevant stakeholders
across the company (including preemptive identification of dependencies,
synergies, and blockers). Development and deployment of personalised
features to production, including evaluating the business impact.
- Setting up objectives, key
results, and key performance indicators of the Personalisation
squad based on the company’s OKRs (GTMHub). Reporting to the C-level
management and the board of directors.
Machine Learning Engineer
Rohlik Group, Prague, Czech Republic, 02/2021-03/2022
- Covered domains: stakeholder management in the
agile set-up (using Jira), data engineering, ML model development and
deployment in production using Keboola and AWS (both batch and real-time
predictions) and performance evaluation. Focus on the personalization of
the product and CRM, solving various classification and regression tasks
in the international context.
- Data engineering. Data models and ETL self-service
in Keboola (including REST APIs via Postman) and AWS (S3, Redshift,
MySQL).
- MLOps using AWS - Sagemaker, Lambda, CloudWatch,
Glue, API Gateway.
- A/B testing - design, execution, and evaluation.
Dashboards in Tableau, ad hoc reports using Jupyter Notebooks. Git using
GitLab and AWS Codecommit.
- Other tools - Python (including various packages like pandas or
seaborn), Snowflake, PySpark, TensorFlow.
Data Analyst
Meiro, Brno, Czech Republic, 08/2020–11/2020
- Covered domains: Data Engineering, Data Analysis, Data
Science.
- ETL pipelines management, Design of data
models.
- Integrating PostgreSQL and MySQL
with R and Python, data wrangling,
description, and visualization to advanced statistical techniques and
data science techniques (e.g. recommendation engine and
customer segmentation) in Python using
VS Code. Fundamentals of Spark.
- Linux desktop (Ubuntu), Bash, Git. Fundamentals of
Docker and CD/CI.
Data Analyst
Kiwi.com, Brno, Czech Republic, 04/2019–07/2020
- Covered domains: Product, Customer Experience, Customer
Support.
- Reports. Integrating PostgreSQL, Snowflake, and
BigQuery with R and
Python, data wrangling, description, and visualization
to advanced statistical techniques (regression models, structural
equation modelling) in R. Reporting in Markdown (R notebooks,
Jupyter Notebooks, oral presentations).
- Dashboards. I’m proficient in working with tools like Looker,
GoodData, Google Data Studio, or Retool (Plotly).
- Data engineering. Sense of data models and ETL self-service
(Keboola, dbt).
- Linux desktop (Ubuntu), Bash,
Git.
- Jira, Scrum.
Lecturer
Masaryk University, Brno, Czech Republic,
09/2015–09/2020
- Demonstrations of analyses and their interpretations, providing oral
and written feedback in the following courses:
- Statistical Data
Analysis I.
- Correlation, contingency tables, t-test, an introduction to
non-parametric tests (e.g. chi-square).
- Statistical Data
Analysis II.
- Multiple linear regression, ANOVA, logistic regression, factor
analysis, mixed effect models.
- An
Introduction to R
- An introduction to the R language, data
cleaning, wrangling, description and visualization, multivariate
analyses in the R language.
Researcher
Transport Research Centre, Brno, Czech Republic,
06/2015–03/2019
- Travel behaviour analyses, coordination of research activities,
communication with the lay public as well as the community
of experts.
- Investigator in the project Česko v pohybu. Development of
the research tool, development and implementation of the probabilistic
sampling procedure and algorithms for automated control of the data
quality.
- Methodological and analytical supervision of the research project
for the Czech Ministry of Transport related to the Public
opinion on autonomous vehicles.
- Project management of small project teams, e.g. program section for
the conference Dopravní
chování v datech.
Internships
Danmarks Tekniske Universitet, Management Engineering, Lyngby,
Denmark. 08-09/2017
Corpus Christi College, University of Cambridge, Cambridge, UK.
07-09/2015
LS0tCnRpdGxlOiAiQ3VycmljdWx1bSBWaXRhZSIKYXV0aG9yOiAiVml0IEdhYnJoZWwiCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICBhbGxpZ246IHJpZ2h0CiAgICB0aGVtZTogZmxhdGx5CiAgICBoaWdobGlnaHQ6IG1vbm9jaHJvbWUKICAgIGNzczogJy9Vc2Vycy92aXRnYWJyaGVsL0Rlc2t0b3AvR2l0L1BlcnNvbmFsL2RhdGFtdXN0Zmxvdy9wdWJsaWMvY3NzL2NvZGVyLm1pbi5hNGYzMzIyMTNhMjFjZThlYjUyMTY3MGM2MTQ0NzBjNTg5MjNhYWFmMzg1ZTJhNzM5ODJjMzFkZDc2NDJkZWNiLmNzcycKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6ICcxJwogIHBkZl9kb2N1bWVudDoKICAgIHRvYzogbm8KICAgIHRvY19kZXB0aDogJzEnCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogbm8KICAgIHRvY19kZXB0aDogJzEnCiAgICBkZl9wcmludDogcGFnZWQKLS0tCgojIEludHJvZHVjdGlvbgoKSGksIEkgYW0gYSBkYXRhIHByYWN0aXRpb25lciB3aXRoIGV4cGVyaWVuY2UgaW4gdmFyaW91cyBkYXRhLXJlbGF0ZWQgYXJlYXMgKGRhdGEgZW5naW5lZXJpbmcsIGRhdGEgYW5hbHlzaXMsIGRhdGEgc2NpZW5jZSwgbWFjaGluZSBsZWFybmluZykgYW5kIGJ1c2luZXNzIGRvbWFpbnMgKGN1c3RvbWVyIHN1cHBvcnQsIGN1c3RvbWVyIHN1Y2Nlc3MsIHByb2R1Y3QsIG1hcmtldGluZywgcGVyc29uYWxpemF0aW9uLCBzYWxlcykuIAoKSSBhbSBhbiBpbmRlcGVuZGVudCAqKlB5dGhvbioqIHVzZXIsIHdobyBpcyBhbHNvIHByb2ZpY2llbnQgaW4gbXVsdGlwbGUgZGF0YWJhc2UgcXVlcnlpbmcgbGFuZ3VhZ2VzL2RpYWxlY3RzICgqKlBvc3RncmVTUUwsIE15U1FMLCBTbm93Zmxha2UsIFN0YW5kYXJkIFNRTCoqIGluICoqQmlnUXVlcnkqKikgd2l0aCBleHBlcmllbmNlIGluIGFyZWFzIHJhbmdpbmcgZnJvbSB0aGUgZGF0YSBjb2xsZWN0aW9uIHRocm91Z2ggaXRzICoqd3JhbmdsaW5nLCBtb2RlbGxpbmcsIGRlc2NyaXB0aW9uLCB2aXp1YWxpc2F0aW9uKiogdG8gdGhlIG1hY2hpbmUgbGVhcm5pbmcgdGVjaG5pcXVlcyBhbmQgbW9kZWxzICgqKlhHQm9vc3QsIEtNcywgV29yZDJ2ZWMqKikuIAoKTGF0ZWx5LCBJIGhhdmUgZ2FpbmVkIGV4cGVyaWVuY2Ugd2l0aCBkYXRhIHNjaWVuY2UgdGVjaG5pcXVlcyAobGlrZSBzZWdtZW50YXRpb24gb3IgcmVjb21tZW5kYXRpb24gZW5naW5lcykgYW5kIExMTXMgaW4gdGhlIGluZHVzdHJ5IGNvbnRleHQgYW5kIGRhdGEgZW5naW5lZXJpbmcgYXJlYXMgKEVUTCwgZGF0YSBtb2RlbHMsIGRhdGEgYXJjaGl0ZWN0dXJlKS4KCiMjIERhdGEgRW5naW5lZXIKCk1ha2UsIFByYWd1ZSwgQ3plY2ggUmVwdWJsaWMsICoxMi8yMDIyLXByZXNlbnQqCgoqICoqRGF0YSBlbmdpbmVlcmluZyoqLiBEZXZlbG9wbWVudCBhbmQgaW1wbGVtZW50YXRpb24gb2YgdGhlIENEL0NJIHBpcGVsaW5lIGZvciBLZWJvb2xhIHVzaW5nIGtiLWNsaSwgR2l0SHViLCBhbmQgR2l0SHViIEFjdGlvbnMuIEJ1aWxkaW5nIEVMVCBwaXBlbGluZXMgYW5kIGRhdGEgbW9kZWxsaW5nLiBCdWlsZGluZyBjdXN0b20gRXh0cmFjdC9Mb2FkIGNvbXBvbmVudHMgZm9yIHZhcmlvdXMgU2FsZXMvQ1JNIHBsYXRmb3JtcyAoQ2Vsb25pcywgWm9vbUluZm8pIHVzaW5nIHRoZSByZXF1ZXN0IGxpYnJhcnkuIEFkZHJlc3NpbmcgZGF0YSBxdWFsaXR5LiBDb2RlIHJldmlld2luZy4gRGF0YU9wcyBhbmQgRmluT3BzLiBBaXJmbG93LCBBbWF6b24gTWFuYWdlZCBXb3JrZmxvd3MgZm9yIEFwYWNoZSBBaXJmbG93LiBEYXRhIFF1YWxpdHkgdXNpbmcgU29kYS4gCiogKipNYWNoaW5lIExlYXJuaW5nKiouIERlcGxveWluZyBkYXRhIHNjaWVuY2UgcHJvamVjdHMgKExUViBvciBwZXJzb25hcykgaW50byBwcm9kdWN0aW9uLiBNTE9wcy4gU3RyYXRlZ3kgZm9yIHRoZSBNTCBpbmZyYXN0cnVjdHVyZSBkZXZlbG9wbWVudC4gQ29kZSByZXZpZXdpbmcuCiogR2VuZXJhbGx5IHVzZWQgdG9vbHMuIFB5dGhvbiAzLjExKywgU25vd2ZsYWtlLCBBaXJmbG93LCBBV1MsIEdpdGh1YiwgTWFrZSwgQ29uZmx1ZW5jZSwgU2xhY2ssIEppcmEKCiMjIE1hY2hpbmUgTGVhcm5pbmcgRW5naW5lZXIKCkF0YWNjYW1hLCBQcmFndWUsIEN6ZWNoIFJlcHVibGljLCAqMDcvMjAyMi0xMC8yMDIyKgoKKiBBcyBhIHBhcnQgb2YgdGhlIERhdGEgU3RvcmllcyB0ZWFtLCBJIGNvbnRyaWJ1dGVkIHRvIHRoZSBiYWNrLWVuZCAoaWRpb21hdGljIGFuZCBweWRhbnRpYy1kcml2ZW4gUHl0aG9uLCBGQVNUIEFQSSkgYW5kIGZyb250LWVuZCAoVHlwZVNjcmlwdCwgVnVlLmpzKSBjb2RlYmFzZXMuIFRoZSB1c2UtY2FzZXMgaW5jbHVkZWQgdXNlci1kZWZpbmVkIGZpbHRlcnMgb3IgY2hhcnRzIGFuZCBhdHRyaWJ1dGVzIHJlY29tbWVuZGF0aW9uLgoqIFVuaXQgdGVzdGluZyB2aWEgcHl0ZXN0IChpbmNsdWRpbmcgY29udHJpYnV0aW9uIHRvIHRoZSBDSS9DRCBwaXBlbGluZSkuIEdpdCB1c2luZyBHaXRsYWIuIExpbnRpbmcgdXNpbmcgYmxhY2ssIGlzb3J0LCBhbmQgZmxha2U4LiBEb2NrZXIsIEt1YmVybmV0ZXMsIGt1c3RvbWl6ZSBhbmQgSGVsbS4KKiBEYXRhIGFuYWx5dGljcyBhbmQgZGF0YSBzY2llbmNlIC0gcHJvdG90eXBpbmcgdmlhIEp1cHl0ZXIgTm90ZWJvb2tzLgoqIEdlbmVyYWxseSB1c2VkIHRvb2xzLiBQeXRob24gMy4xMCwgU25vd2ZsYWtlLCBNeVNRTCwgUkVTVCBBUEksIEppcmEsIE5vdGlvbi4KCiMjIERhdGEgJiBNYWNoaW5lIExlYXJuaW5nIEVuZ2luZWVyCgpDbG91ZFRhbGssIFByYWd1ZSwgQ3plY2ggUmVwdWJsaWMsICowNC8yMDIyLTA2LzIwMjIqCgoqICoqRGF0YSBlbmdpbmVlcmluZyoqLiBEZXZlbG9wbWVudCBhbmQgaW1wbGVtZW50YXRpb24gb2YgdGhlIENEL0NJIHBpcGVsaW5lIGZvciBLZWJvb2xhIHVzaW5nIGtiLWNsaSwgR2l0SHViLCBhbmQgR2l0SHViIEFjdGlvbnMuIEJ1aWxkaW5nIEVMVCBwaXBlbGluZXMgYW5kIGRhdGEgbW9kZWxsaW5nLiBCdWlsZGluZyBjdXN0b20gRXh0cmFjdC9Mb2FkIGNvbXBvbmVudHMgZm9yIHZhcmlvdXMgU2FsZXMvQ1JNIHBsYXRmb3JtcyAoSHViU3BvdCwgQ3J1bmNoYmFzZSwgQXBvbGxvKSB1c2luZyB0aGUgcmVxdWVzdCBsaWJyYXJ5LiBBZGRyZXNzaW5nIGRhdGEgcXVhbGl0eSB0b3BpY3MgbGlrZSBlbnRpdHkgcHJvZmlsaW5nLiBDb2RlIHJldmlld2luZy4KKiAqKk1hY2hpbmUgTGVhcm5pbmcqKi4gRGV2ZWxvcGluZyBhbnRpLWZyYXVkIHByZWRpY3Rpb24gbW9kZWxzLiBEZWZpbmVkIGJ1c2luZXNzIGxvZ2ljIHdpdGggc3Rha2Vob2xkZXJzIGFuZCBzZXR0aW5nIHVwIGFsZXJ0aW5nLiBJbXBsZW1lbnRpbmcgY29va2llY3V0dGVyIGZyYW1ld29yayBmb3IgZGV2ZWxvcGluZyBkYXRhIHNjaWVuY2UgcHJvamVjdHMuIFByZXBhcmVkIGEgc3RyYXRlZ3kgZm9yIHRoZSBNTCBpbmZyYXN0cnVjdHVyZSBkZXZlbG9wbWVudC4gQ29kZSByZXZpZXdpbmcuCiogKipEYXRhIGFuYWx5dGljcyoqLiBBZCBob2MgcmVwb3J0cyB1c2luZyBKdXB5dGVyIE5vdGVib29rcyBhbmQgUmVkYXNoLgoqIEdlbmVyYWxseSB1c2VkICoqdG9vbHMqKi4gUHl0aG9uIDMsIFNub3dmbGFrZSwgTUwgRmxvdywgTXlTUUwsIFJFU1QgQVBJLCBKaXJhLCBPdXRsaW5lLiAKCiMjIEludGVyaW0gUHJvZHVjdCBPd25lciBvZiBQZXJzb25hbGl6YXRpb24KClJvaGxpayBHcm91cCwgUHJhZ3VlLCBDemVjaCBSZXB1YmxpYywgKjA5LzIwMjEtMDMvMjAyMioKCiogKipEaXN0cmlidXRlZCBsZWFkZXJzaGlwKiogb2YgdGhlIDQtbWVtYmVyIHRlYW0gKGEgYmFjay1lbmQgZGV2ZWxvcGVyLCBhIHRlc3RlciwgYSBkYXRhIGFuYWx5c3QsIGEgbWFjaGluZS1sZWFybmluZyBlbmdpbmVlcikuIFNldHRpbmcgYSByb2FkbWFwLCBhZ2lsZSBjZXJlbW9uaWVzIChwbGFubmluZywgZ3Jvb21pbmcsIHJldHJvc3BlY3RpdmVzLCBldGMuKS4KKiAqKkZlYXR1cmUgTGlmZWN5Y2xlIE1hbmFnZW1lbnQqKiAtIGNvbGxlY3RpbmcgYW5kIHByaW9yaXRpc2luZyBidXNpbmVzcyByZXF1aXJlbWVudHMgYmFzZWQgb24gdGhlaXIgYWxpZ25tZW50IHdpdGggdGhlIGNvbXBhbnkncyBidXNpbmVzcyBnb2Fscy4gQWxpZ25tZW50IHdpdGggb3RoZXIgcmVsZXZhbnQgc3Rha2Vob2xkZXJzIGFjcm9zcyB0aGUgY29tcGFueSAoaW5jbHVkaW5nIHByZWVtcHRpdmUgaWRlbnRpZmljYXRpb24gb2YgZGVwZW5kZW5jaWVzLCBzeW5lcmdpZXMsIGFuZCBibG9ja2VycykuIERldmVsb3BtZW50IGFuZCBkZXBsb3ltZW50IG9mIHBlcnNvbmFsaXNlZCBmZWF0dXJlcyB0byBwcm9kdWN0aW9uLCBpbmNsdWRpbmcgZXZhbHVhdGluZyB0aGUgYnVzaW5lc3MgaW1wYWN0LgoqIFNldHRpbmcgdXAgKipvYmplY3RpdmVzKiosICoqa2V5IHJlc3VsdHMqKiwgYW5kIGtleSBwZXJmb3JtYW5jZSBpbmRpY2F0b3JzIG9mIHRoZSBQZXJzb25hbGlzYXRpb24gc3F1YWQgYmFzZWQgb24gdGhlIGNvbXBhbnkncyBPS1JzIChHVE1IdWIpLiBSZXBvcnRpbmcgdG8gdGhlIEMtbGV2ZWwgbWFuYWdlbWVudCBhbmQgdGhlIGJvYXJkIG9mIGRpcmVjdG9ycy4KCiMjIE1hY2hpbmUgTGVhcm5pbmcgRW5naW5lZXIKClJvaGxpayBHcm91cCwgUHJhZ3VlLCBDemVjaCBSZXB1YmxpYywgKjAyLzIwMjEtMDMvMjAyMioKCiogKipDb3ZlcmVkIGRvbWFpbnMqKjogc3Rha2Vob2xkZXIgbWFuYWdlbWVudCBpbiB0aGUgYWdpbGUgc2V0LXVwICh1c2luZyBKaXJhKSwgZGF0YSBlbmdpbmVlcmluZywgTUwgbW9kZWwgZGV2ZWxvcG1lbnQgYW5kIGRlcGxveW1lbnQgaW4gcHJvZHVjdGlvbiB1c2luZyBLZWJvb2xhIGFuZCBBV1MgKGJvdGggYmF0Y2ggYW5kIHJlYWwtdGltZSBwcmVkaWN0aW9ucykgYW5kIHBlcmZvcm1hbmNlIGV2YWx1YXRpb24uIEZvY3VzIG9uIHRoZSBwZXJzb25hbGl6YXRpb24gb2YgdGhlIHByb2R1Y3QgYW5kIENSTSwgc29sdmluZyB2YXJpb3VzIGNsYXNzaWZpY2F0aW9uIGFuZCByZWdyZXNzaW9uIHRhc2tzIGluIHRoZSBpbnRlcm5hdGlvbmFsIGNvbnRleHQuCiogKipEYXRhIGVuZ2luZWVyaW5nKiouIERhdGEgbW9kZWxzIGFuZCBFVEwgc2VsZi1zZXJ2aWNlIGluIEtlYm9vbGEgKGluY2x1ZGluZyBSRVNUIEFQSXMgdmlhIFBvc3RtYW4pIGFuZCBBV1MgKFMzLCBSZWRzaGlmdCwgTXlTUUwpLgoqICoqTUxPcHMgdXNpbmcgQVdTKiogLSBTYWdlbWFrZXIsIExhbWJkYSwgQ2xvdWRXYXRjaCwgR2x1ZSwgQVBJIEdhdGV3YXkuCiogKipBL0IgdGVzdGluZyoqIC0gZGVzaWduLCBleGVjdXRpb24sIGFuZCBldmFsdWF0aW9uLiBEYXNoYm9hcmRzIGluIFRhYmxlYXUsIGFkIGhvYyByZXBvcnRzIHVzaW5nIEp1cHl0ZXIgTm90ZWJvb2tzLiBHaXQgdXNpbmcgR2l0TGFiIGFuZCBBV1MgQ29kZWNvbW1pdC4KKiBPdGhlciB0b29scyAtIFB5dGhvbiAoaW5jbHVkaW5nIHZhcmlvdXMgcGFja2FnZXMgbGlrZSBwYW5kYXMgb3Igc2VhYm9ybiksIFNub3dmbGFrZSwgUHlTcGFyaywgVGVuc29yRmxvdy4KCiMjIERhdGEgQW5hbHlzdAoKTWVpcm8sIEJybm8sIEN6ZWNoIFJlcHVibGljLCAqMDgvMjAyMOKAkzExLzIwMjAqCgoqIENvdmVyZWQgZG9tYWluczogKkRhdGEgRW5naW5lZXJpbmcsIERhdGEgQW5hbHlzaXMsIERhdGEgU2NpZW5jZSouCiogKipFVEwgcGlwZWxpbmVzIG1hbmFnZW1lbnQqKiwgKipEZXNpZ24gb2YgZGF0YSBtb2RlbHMqKi4KKiBJbnRlZ3JhdGluZyAqKlBvc3RncmVTUUwqKiBhbmQgKipNeVNRTCoqICB3aXRoICoqUioqIGFuZCAqKlB5dGhvbioqLCBkYXRhIHdyYW5nbGluZywgZGVzY3JpcHRpb24sIGFuZCB2aXN1YWxpemF0aW9uIHRvIGFkdmFuY2VkIHN0YXRpc3RpY2FsIHRlY2huaXF1ZXMgYW5kIGRhdGEgc2NpZW5jZSB0ZWNobmlxdWVzIChlLmcuICoqcmVjb21tZW5kYXRpb24gZW5naW5lKiogYW5kICoqY3VzdG9tZXIgc2VnbWVudGF0aW9uKiopIGluICoqUHl0aG9uKiogdXNpbmcgKlZTIENvZGUqLiBGdW5kYW1lbnRhbHMgb2YgKipTcGFyayoqLgoqIExpbnV4IGRlc2t0b3AgKFVidW50dSksIEJhc2gsIEdpdC4gRnVuZGFtZW50YWxzIG9mICoqRG9ja2VyKiogYW5kICoqQ0QvQ0kqKi4KCiMjIERhdGEgQW5hbHlzdApLaXdpLmNvbSwgQnJubywgQ3plY2ggUmVwdWJsaWMsICowNC8yMDE54oCTMDcvMjAyMCoKCiogQ292ZXJlZCBkb21haW5zOiAqUHJvZHVjdCwgQ3VzdG9tZXIgRXhwZXJpZW5jZSwgQ3VzdG9tZXIgU3VwcG9ydCouCiogUmVwb3J0cy4gSW50ZWdyYXRpbmcgKipQb3N0Z3JlU1FMLCBTbm93Zmxha2UqKiwgYW5kICoqQmlnUXVlcnkqKiB3aXRoICoqUioqIGFuZCAqKlB5dGhvbioqLCBkYXRhIHdyYW5nbGluZywgZGVzY3JpcHRpb24sIGFuZCB2aXN1YWxpemF0aW9uIHRvIGFkdmFuY2VkIHN0YXRpc3RpY2FsIHRlY2huaXF1ZXMgKHJlZ3Jlc3Npb24gbW9kZWxzLCBzdHJ1Y3R1cmFsIGVxdWF0aW9uIG1vZGVsbGluZykgaW4gUi4gUmVwb3J0aW5nIGluIE1hcmtkb3duICgqKlIgbm90ZWJvb2tzLCBKdXB5dGVyIE5vdGVib29rcyoqLCBvcmFsIHByZXNlbnRhdGlvbnMpLgoqIERhc2hib2FyZHMuIEnigJltIHByb2ZpY2llbnQgaW4gd29ya2luZyB3aXRoIHRvb2xzIGxpa2UgTG9va2VyLCBHb29kRGF0YSwgR29vZ2xlIERhdGEgU3R1ZGlvLCBvciBSZXRvb2wgKFBsb3RseSkuCiogRGF0YSBlbmdpbmVlcmluZy4gU2Vuc2Ugb2YgZGF0YSBtb2RlbHMgYW5kIEVUTCBzZWxmLXNlcnZpY2UgKEtlYm9vbGEsIGRidCkuCiogTGludXggZGVza3RvcCAoVWJ1bnR1KSwgKipCYXNoKiosICoqR2l0KiouCiogKipKaXJhKiosICoqU2NydW0qKi4KCiMjIExlY3R1cmVyCk1hc2FyeWsgVW5pdmVyc2l0eSwgQnJubywgQ3plY2ggUmVwdWJsaWMsICowOS8yMDE14oCTMDkvMjAyMCoKCiogRGVtb25zdHJhdGlvbnMgb2YgYW5hbHlzZXMgYW5kIHRoZWlyIGludGVycHJldGF0aW9ucywgcHJvdmlkaW5nIG9yYWwgYW5kIHdyaXR0ZW4gZmVlZGJhY2sgaW4gdGhlIGZvbGxvd2luZyBjb3Vyc2VzOgogICogW1N0YXRpc3RpY2FsIERhdGEgQW5hbHlzaXMgSS5dKGh0dHBzOi8vaXMubXVuaS5jei9jb3Vyc2UvZnNzL3NwcmluZzIwMTgvUFNZMTE3KQogICAgKiAqQ29ycmVsYXRpb24sIGNvbnRpbmdlbmN5IHRhYmxlcywgdC10ZXN0LCBhbiBpbnRyb2R1Y3Rpb24gdG8gbm9uLXBhcmFtZXRyaWMgdGVzdHMgKGUuZy4gY2hpLXNxdWFyZSkqLgogICogW1N0YXRpc3RpY2FsIERhdGEgQW5hbHlzaXMgSUkuXShodHRwczovL2lzLm11bmkuY3ovY291cnNlL2Zzcy9hdXR1bW4yMDE4L1BTWTI1MikKICAgICogKk11bHRpcGxlIGxpbmVhciByZWdyZXNzaW9uLCBBTk9WQSwgbG9naXN0aWMgcmVncmVzc2lvbiwgZmFjdG9yIGFuYWx5c2lzLCBtaXhlZCBlZmZlY3QgbW9kZWxzKi4KICAqIFtBbiBJbnRyb2R1Y3Rpb24gdG8gUl0oaHR0cHM6Ly9pcy5tdW5pLmN6L2NvdXJzZS9mc3MvYXV0dW1uMjAxOS9QU1luNTMyMCkKICAgICogQW4gaW50cm9kdWN0aW9uIHRvIHRoZSAqKlIgbGFuZ3VhZ2UqKiwgKmRhdGEgY2xlYW5pbmcsIHdyYW5nbGluZywgZGVzY3JpcHRpb24gYW5kIHZpc3VhbGl6YXRpb24sIG11bHRpdmFyaWF0ZSBhbmFseXNlcyBpbiB0aGUgUiBsYW5ndWFnZS4qCgojIyBSZXNlYXJjaGVyClRyYW5zcG9ydCBSZXNlYXJjaCBDZW50cmUsIEJybm8sIEN6ZWNoIFJlcHVibGljLCAqMDYvMjAxNeKAkzAzLzIwMTkqCgoqIFRyYXZlbCBiZWhhdmlvdXIgYW5hbHlzZXMsIGNvb3JkaW5hdGlvbiBvZiByZXNlYXJjaCBhY3Rpdml0aWVzLCBjb21tdW5pY2F0aW9uIHdpdGggdGhlIGxheSBwdWJsaWMgYXMgd2VsbCBhcyB0aGUgW2NvbW11bml0eSBvZiBleHBlcnRzXShodHRwczovL2xpbmsuc3ByaW5nZXIuY29tL2FydGljbGUvMTAuMTAwNy9zMTI1NDQtMDE4LTAyODYtOCkuCiogSW52ZXN0aWdhdG9yIGluIHRoZSBwcm9qZWN0IFvEjGVza28gdiBwb2h5YnVdKGh0dHBzOi8vd3d3LmNlc2tvdnBvaHlidS5jei8pLiBEZXZlbG9wbWVudCBvZiB0aGUgcmVzZWFyY2ggdG9vbCwgZGV2ZWxvcG1lbnQgYW5kIGltcGxlbWVudGF0aW9uIG9mIHRoZSBwcm9iYWJpbGlzdGljIHNhbXBsaW5nIHByb2NlZHVyZSBhbmQgYWxnb3JpdGhtcyBmb3IgYXV0b21hdGVkIGNvbnRyb2wgb2YgdGhlIGRhdGEgcXVhbGl0eS4KKiBNZXRob2RvbG9naWNhbCBhbmQgYW5hbHl0aWNhbCBzdXBlcnZpc2lvbiBvZiB0aGUgcmVzZWFyY2ggcHJvamVjdCBmb3IgdGhlIEN6ZWNoIE1pbmlzdHJ5IG9mIFRyYW5zcG9ydCByZWxhdGVkIHRvIHRoZSBbUHVibGljIG9waW5pb24gb24gYXV0b25vbW91cyB2ZWhpY2xlc10oaHR0cHM6Ly90b3RzLnVwb2wuY3ovYXJ0a2V5L3RvdC0yMDE5MDItMDAwNF9wdWJsaWMtb3Bpbmlvbi1vbi1jb25uZWN0ZWQtYW5kLWF1dG9tYXRlZC12ZWhpY2xlcy10aGUtY3plY2gtY29udGV4dC5waHApLgoqIFByb2plY3QgbWFuYWdlbWVudCBvZiBzbWFsbCBwcm9qZWN0IHRlYW1zLCBlLmcuIHByb2dyYW0gc2VjdGlvbiBmb3IgdGhlIGNvbmZlcmVuY2UgW0RvcHJhdm7DrSBjaG92w6Fuw60gdiBkYXRlY2hdKGh0dHBzOi8vd3d3LmNkdi5jei9rb25mZXJlbmNlLWRvcHJhdm5pLWNob3Zhbmktdi1kYXRlY2gtMjAxOC8pLgoKIyBFZHVjYXRpb24KCiMjIFBzeWNob2xvZ3kgKFBoLkQuKQpNYXNhcnlrIFVuaXZlcnNpdHksIEJybm8sIEN6ZWNoIFJlcHVibGljLCAqMDkvMjAxNeKAkzA2LzIwMjIqCgoqIFNwZWNpYWxpc2F0aW9uIGluIGFkdmFuY2VkIGFuYWx5dGljYWwgbWV0aG9kcyDigJMgW3N0cnVjdHVyYWwgZXF1YXRpb24gbW9kZWxsaW5nXShodHRwczovL2RpZ2l0YWxjb21tb25zLmNpaXMuZWR1L2NnaS92aWV3Y29udGVudC5jZ2k/YXJ0aWNsZT0xNTE2JmNvbnRleHQ9aWp0cy10cmFuc3BlcnNvbmFsc3R1ZGllcyksIFttdWx0aW5vbWlhbCByZWdyZXNzaW9uXShodHRwczovL3d3dy50b3RzLnVwb2wuY3ovcGRmcy90b3QvMjAxOS8wMS8wMy5wZGYpLgoqIE1lbWJlciBvZiB0aGUgKkRpc2NpcGxpbmFyeSBDb21taXR0ZWUg4oCUIEZhY3VsdHkgb2YgU29jaWFsIFN0dWRpZXMqLgoqIFRoZXNpczogW0ludGVudGlvbiB0byBVc2UgQXV0b25vbW91cyBWZWhpY2xlc10oaHR0cHM6Ly9pcy5tdW5pLmN6L3RoL3Y2MnVtLykKKiBHcmFkdWF0ZWQgd2l0aCBbaG9ub3Vyc10oaHR0cHM6Ly9pcy5tdW5pLmN6L3N0dWRlbnQvdnlzdGF2ZW5lX3puYW1reT9sYW5nPWVuO3NldGxhbmc9ZW47c3R1ZGl1bV9vc29ieT04OTYyOTApLgoKIyMgUHN5Y2hvbG9neSAoTWFzdGVyIGRlZ3JlZSkKTWFzYXJ5ayBVbml2ZXJzaXR5LCBCcm5vLCBDemVjaCBSZXB1YmxpYywgKjIwMTPigJMyMDE1KgoKKiBTcGVjaWFsaXNhdGlvbiBpbiAqKmZyZXF1ZW50aXN0IHN0YXRpc3RpY3MqKiwgaW50cm9kdWN0aW9uIHRvIEJheWVzaWFuIHN0YXRpc3RpY3MuCiogU2Nob2xhcnNoaXAgZm9yIGV4Y2VsbGVudCBwZXJmb3JtYW5jZSBpbiByZXNlYXJjaCBhY3Rpdml0aWVzIGdpdmVuIGJ5IHRoZSBGYWN1bHR5IG9mIFNvY2lhbCBTdHVkaWVzIGR1cmluZyB0aGUgYWNhZGVtaWMgeWVhciAyMDEzLzIwMTQuCiogVGhlc2lzOiBbU3R1ZGVudCBTdHlsZXMgUXVlc3Rpb25uYWlyZSBpbiB0aGUgQ3plY2ggY29udGV4dDogQSBwaWxvdCBzdHVkeV0oaHR0cHM6Ly9pcy5tdW5pLmN6L3RoL2xsMW00Lz9sYW5nPWVuKQoqIEdyYWR1YXRlZCB3aXRoIFtob25vdXJzXShodHRwczovL2lzLm11bmkuY3ovc3R1ZGVudC92eXN0YXZlbmVfem5hbWt5P2xhbmc9ZW47c3R1ZGl1bV9vc29ieT02NjUwOTcpLgoKIyMgUHN5Y2hvbG9neSBhbmQgU29jaW9sb2d5IChCYWNoZWxvciBkZWdyZWUpCk1hc2FyeWsgVW5pdmVyc2l0eSwgQnJubywgQ3plY2ggUmVwdWJsaWMsICoyMDEw4oCTMjAxMyoKCiogU3BlY2lhbGlzYXRpb24gaW4gcXVhbnRpdGF0aXZlIG1ldGhvZG9sb2d5IGFuZCBzdGF0aXN0aWNhbCBkYXRhIGFuYWx5c2lzIGluIElCTSBTUFNTIHdpdGggZm9jdXMgb24gbGluZWFyIG1vZGVscy4KKiBTY2hvbGFyc2hpcCBmb3IgYmVzdCBzdHVkZW50cyBvZiBGYWN1bHR5IG9mIFNvY2lhbCBTdHVkaWVzIGR1cmluZyB0aGUgYWNhZGVtaWMgeWVhcnMgMjAxMC8yMDExIGFuZCAyMDExLzIwMTIuCiogVGhlc2lzOiBbVGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHNwaXJpdHVhbGl0eSBhbmQgYXV0b25vbXkgaW4gbGF0ZSBhZG9sZXNjZW5jZSBhbmQgZW1lcmdpbmcgYWR1bHRob29kXShodHRwczovL2lzLm11bmkuY3ovdGgvbmxkYXAvP2xhbmc9ZW4pLgoqIEdyYWR1YXRlZCB3aXRoIFtob25vdXJzXShodHRwczovL2lzLm11bmkuY3ovc3R1ZGVudC92eXN0YXZlbmVfem5hbWt5P2xhbmc9ZW47c3R1ZGl1bV9vc29ieT01NDQ1NDQpLgoKIyBJbnRlcm5zaGlwcwpEYW5tYXJrcyBUZWtuaXNrZSBVbml2ZXJzaXRldCwgTWFuYWdlbWVudCBFbmdpbmVlcmluZywgTHluZ2J5LCBEZW5tYXJrLiAqMDgtMDkvMjAxNyoKCkNvcnB1cyBDaHJpc3RpIENvbGxlZ2UsIFVuaXZlcnNpdHkgb2YgQ2FtYnJpZGdlLCBDYW1icmlkZ2UsIFVLLiAqMDctMDkvMjAxNSoKCiMgU2VsZWN0ZWQgcHVibGljYXRpb25zCgoqIEdhYnJoZWwsIFYuLCBKZcW+ZWssIFMuICgyMDE3KS4gRmFjdG9yIHZhbGlkaXR5IGFuZCBpbnRlcm5hbCBjb25zaXN0ZW5jeSBvZiB0aGUgRXhwcmVzc2lvbnMgb2YgU3Bpcml0dWFsaXR5IEludmVudG9yeSDigJMgUmV2aXNlZCAoRVNJLVIpOiBUaGUgQ3plY2ggY29udGV4dC4gSW50ZXJuYXRpb25hbCBKb3VybmFsIG9mIFRyYW5zcGVyc29uYWwgU3R1ZGllcywgMzYgKDEpLCAxMDEtMTA5LiBkb2k6MTAuMjQ5NzIvaWp0cy4yMDE3LjM2LjEuMTAxLgoqIEdhYnJoZWwsIFYuICgyMDE5KS4gRmVlbGluZyBsaWtlIGN5Y2xpbmc/IFBzeWNob2xvZ2ljYWwgZmFjdG9ycyByZWxhdGVkIHRvIGN5Y2xpbmcgYXMgYSBtb2RlIGNob2ljZS4gVHJhbnNhY3Rpb25zIG9uIFRyYW5zcG9ydCBTY2llbmNlcywgMTAgKDEpLiBkb2k6MTAuMTAwNy85NzgtMy0zMTktNjA0NDEtMV84MAoqIEdhYnJoZWwsIFYuLCBKZcW+ZWssIFMuLCBIYXZsw63EjWtvdsOhLCBELiAoMjAxOSkuIFB1YmxpYyBvcGluaW9uIG9uIGNvbm5lY3RlZCBhbmQgYXV0b21hdGVkIHZlaGljbGVzOiB0aGUgQ3plY2ggY29udGV4dC4gVHJhbnNhY3Rpb25zIG9uIFRyYW5zcG9ydCBTY2llbmNlcywgMTAgKDIpLiBkb2k6MTAuNTUwNy90b3RzLjIwMTkuMDExCiogSGF2bMOtxI1rb3bDoSwgRC4sIEdhYnJoZWwsIFYuLCBBZGFtb3Zza8OhLCBFLiwgWsOhbWXEjW7DrWssIFAuICgyMDE5KS4gVGhlIHJvbGUgb2YgZ2VuZGVyIGFuZCBhZ2UgaW4gYXV0b25vbW91cyBtb2JpbGl0eTogZ2VuZXJhbCBhdHRpdHVkZSwgYXdhcmVuZXNzIGFuZCBtZWRpYSBwcmVmZXJlbmNlIGluIHRoZSBjb250ZXh0IG9mIEN6ZWNoIFJlcHVibGljLiBUcmFuc2FjdGlvbnMgb24gVHJhbnNwb3J0IFNjaWVuY2VzLCAxMCAoMikuIGRvaToxMC41NTA3L3RvdHMuMjAxOS4wMTMKKiBHYWJyaGVsLCBWLiwgSmXFvmVrLCBTLiwgJiBaw6FtZcSNbsOtaywgUC4gKDIwMjEpLiBEcml2aW5nIGxvY3VzIG9mIGNvbnRyb2w6IHRoZSBDemVjaCBhZGFwdGF0aW9uLiBDemVjaG9zbG92YWsgUHN5Y2hvbG9neSwgNjUoMSksIDg2LTEwMC4gZG9pOiBodHRwczovL2RvaS5vcmcvMTAuNTE1NjEvY3Nwc3ljaC42NS4xLjg2LgoqIEpha29wZWMsIEEuLCBHYWJyaGVsLCBWLiwgS2VhbmUsIEwuLCBLb3ZhxI0sIE4uLCBSZWlnYmVydCwgSy4sIEFuZGVyc2VuLCBULiBMLiAoMjAxNSkuIFdvcmsgRW5nYWdlbWVudCBhbmQgUGVyZm9ybWFuY2U6IERvZXMgdGhlIChNaXMpQWxpZ25tZW50IG9mIEp1c3RpY2UgU291cmNlcyBNYXR0ZXI/IEpvdXJuYWwgb2YgRXVyb3BlYW4gUHN5Y2hvbG9neSBTdHVkZW50cywgNiAoMiksIDc14oCTNzguIGRvaToxMC41MzM0L2plcHMuY3MuCiogS3VyZcSNa292w6EsIFYuLCBHYWJyaGVsLCBWLiwgWsOhbWXEjW7DrWssIFAuLCBldCBhbC4gKDIwMTcpIEZpcnN0IGFpZCBhcyBhbiBpbXBvcnRhbnQgdHJhZmZpYyBzYWZldHkgZmFjdG9yIOKAkyBldmFsdWF0aW9uIG9mIHRoZSBleHBlcmllbmNl4oCTYmFzZWQgdHJhaW5pbmcuIEV1cm9wZWFuIFRyYW5zcG9ydCBSZXNlYXJjaCBSZXZpZXcsIDkgKDUpLiBkb2k6MTAuMTAwNy9zMTI1NDQtMDE2LTAyMTgtNC8KKiDFoGltZcSNZWssIE0uLCBHYWJyaGVsLCBWLiwgVMO2Z2VsLCBNLiwgJiBMYXpvciwgTS4gKDIwMTgpLiBUcmF2ZWwgYmVoYXZpb3VyIG9mIHNlbmlvcnMgaW4gRWFzdGVybiBFdXJvcGU6IGEgY29tcGFyYXRpdmUgc3R1ZHkgb2YgQnJubyBhbmQgQnJhdGlzbGF2YS4gRXVyb3BlYW4gVHJhbnNwb3J0IFJlc2VhcmNoIFJldmlldywgMTAgKDE2KSwgMS04LiBkb2k6MTAuMTAwNy9zMTI1NDQtMDE4LTAyODYtOAoqIMWgdmFyY292w6EsIEouLCBHYWJyaGVsLCBWLiAoMjAxNCkuIEVkdWNhdGlvbmFsIE1vYmlsaXR5IGFuZCBFZHVjYXRpb25hbCBBc3BpcmF0aW9ucyBvZiBIaWdoIFNjaG9vbCBTdHVkZW50cyBpbiB0aGUgQ3plY2ggUmVwdWJsaWMuIFRoZSBJbnRlcm5hdGlvbmFsIEpvdXJuYWwgb2YgSW50ZXJkaXNjaXBsaW5hcnkgRWR1Y2F0aW9uYWwgU3R1ZGllcywgOCAoMiksIDEtMTIuCiogxaB2YXJjb3bDoSwgSi4sIEhhcmFudG92w6EsIEwuLCAmIEdhYnJoZWwsIFYuICgyMDEzKS4gU3RhdGlzdGljYWwgYW5hbHlzaXMgb2Ygc3R1ZGVudOKAmXMgaW50ZXJlc3QgaW4gY3JlYXRpdmUgcHJvZmVzc2lvbnMgaW4gdGhlIEN6ZWNoIFJlcHVibGljLiBJbnRlcm5hdGlvbmFsIEpvdXJuYWwgb2YgTWF0aGVtYXRpY2FsIE1vZGVscyBhbmQgTWV0aG9kcyBpbiBBcHBsaWVkIFNjaWVuY2VzLCA3ICgyKSwgNDQ0LTQ1MS4KKiBUaGFwYSwgRC4sIEdhYnJoZWwsIFYuLCAmIE1pc2hyYSwgUy4gKDIwMjEpLiBXaGF0IGFyZSB0aGUgZmFjdG9ycyBkZXRlcm1pbmluZyB1c2VyIGludGVudGlvbnMgdG8gdXNlIEFWIHdoaWxlIGltcGFpcmVkPyBUcmFuc3BvcnRhdGlvbiBSZXNlYXJjaCBQYXJ0IEY6IFRyYWZmaWMgUHN5Y2hvbG9neSBhbmQgQmVoYXZpb3VyLCA4MiwgMjM4LTI1NS4gZG9pOiAxMC4xMDE2L2oudHJmLjIwMjEuMDguMDA4LgoKIyBTZWxlY3RlZCB0YWxrcwoKKiBHYWJyaGVsLCBWLiAoMjAxOCkuIFB1YmxpYyBvcGluaW9uIG9uIGF1dG9tYXRlZCB2ZWhpY2xlczogdGhlIEN6ZWNoIGNvbnRleHQuIFBhcGVyIHByZXNlbnRlZCBhdCB0aGUgY29uZmVyZW5jZSBTaWxuacSNbsOtIGtvbmZlcmVuY2UgMjAxOCBpbiBPc3RyYXZhLCBDemVjaCBSZXB1YmxpYy4KKiBHYWJyaGVsLCBWLiwgS291xZlpbCwgUC4sICYgTGF6b3IsIE0uICgyMDE3KS4gxIxlc2tvIHYgcG9oeWJ1LiBQYXBlciBwcmVzZW50ZWQgYXQgdGhlIGNvbmZlcmVuY2UgU2lsbmnEjW7DrSBrb25mZXJlbmNlIDIwMTcgaW4gQnJubywgQ3plY2ggUmVwdWJsaWMuCiogR2FicmhlbCwgVi4sIMWgZW5rLCBQLiwgTGF6b3IsIE0uLCAmIE9uZHLDocSNa292w6EsIEouICgyMDE2KS4gVHJhdmVsIEJlaGF2aW9yIGluIENlbnRyYWwgYW5kIEVhc3Rlcm4gRXVyb3BlOiBhIEJyYXRpc2xhdmEgQ2FzZSBTdHVkeS4gUGFwZXIgcHJlc2VudGVkIGF0IHRoZSBXb3JsZCBDb25mZXJlbmNlIG9uIFRyYW5zcG9ydCBSZXNlYXJjaCDigJMgV0NUUiAyMDE2IFNoYW5naGFpIGluIFNoYW5naGFpLCBQZW9wbGXigJlzIFJlcHVibGljIG9mIENoaW5hLgoqIEdhYnJoZWwsIFYuICgyMDE4KS4gUHVibGljIG9waW5pb24gb24gYXV0b21hdGVkIHZlaGljbGVzOiB0aGUgQ3plY2ggY29udGV4dC4gUGFwZXIgcHJlc2VudGVkIGF0IHRoZSBjb25mZXJlbmNlIFNpbG5pxI1uw60ga29uZmVyZW5jZSAyMDE4IGluIE9zdHJhdmEsIEN6ZWNoIFJlcHVibGljLgoqIEdhYnJoZWwsIFYuLCBaw6FtZcSNbsOtaywgUC4gKDIwMTgpLiBDb25jZXJucyByZWxhdGVkIHRvIHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIGF1dG9ub21vdXMgdmVoaWNsZXMgYW5kIG90aGVyIHRyYW5zcG9ydCBzeXN0w6ltIHVzZXJzLiBQYXBlciBwcmVzZW50ZWQgYXQgdGhlIGNvbmZlcmVuY2UgUm9hZCBTYWZldHkgb24gRml2ZSBDb250aW5lbnRzIGluIEplanUsIFJlcHVibGljIG9mIEtvcmVhLgoqIMWgaW1lxI1laywgTS4sIEdhYnJoZWwsIFYuLCBUb2dlbCwgTS4sICYgTGF6b3IsIE0uICgyMDE2KS4gVHJhdmVsIGJlaGF2aW91ciBvZiBzZW5pb3JzIGluIENlbnRyYWwgRXVyb3BlOiBhIGNvbXBhcmF0aXZlIHN0dWR5IG9mIEJybm8gYW5kIEJyYXRpc2xhdmEuIFBhcGVyIHByZXNlbnRlZCBhdCB0aGUgY29uZmVyZW5jZSBORUNUQVIgSm9pbnQgQ2x1c3RlciAyIGFuZCBDbHVzdGVyIDMgSW50ZXJuYXRpb25hbCBXb3Jrc2hvcCDigJxUaGUgcm9sZSBvZiBwbGFubmluZyB0b3dhcmRzIHN1c3RhaW5hYmxlIHVyYmFuIG1vYmlsaXR54oCdIGluIEJybm8sIEN6ZWNoIFJlcHVibGljLgoKPHAgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPjxiPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkdvIGJhY2s8L2I+PC9hPjwvcD4=