1 Introduction

These notes provide a comprehensive mathematical characterization of hypothesis testing, covering assumptions, procedures, types, performance measures, error types, and practical applications with manual calculations and R verification.

2 What is HTML? (Structure)

HTML (HyperText Markup Language) defines the structure of a web page. It tells the browser what elements exist and how content is organized.

Basic HTML Skeleton

<!DOCTYPE html>  <!-- Tells the browser which HTML version to expect -->
<html>
<head>
    <title>My First Web Page</title>
</head>
<body>
    <h1>Welcome</h1>
    <p>This is a paragraph.</p>
</body>
</html>

Key Concepts

  • <html>: Root element
  • <head>: Metadata (title, styles, links)
  • <body>: Visible content
  • Tags usually come in pairs: <tag>...</tag>

3 2. Common HTML Elements

Text Elements

<h1>Main Heading</h1>
<h2>Subheading</h2>
<p>Paragraph text</p>

Lists

<ul>
  <li>Item 1</li>
  <li>Item 2</li>
</ul>

Links and Images

<a href="https://example.com">Visit Site</a>
<img src="image.jpg" alt="Description">

Div and Section (Layout Containers)

<div>Generic container</div>
<section>Semantic section</section>

4 What is CSS? (Style)

CSS (Cascading Style Sheets) controls the appearance of HTML elements.

Basic CSS Syntax

selector {
    property: value;
}

Example

body {
    background-color: #f4f4f4;
}

h1 {
    color: purple;
}

5 Ways to Add CSS

Inline

<p style="color: red;">Text</p>

Internal

<style>
p { color: blue; }
</style>

External (Best Practice)

<link rel="stylesheet" href="styles.css">

6 Layout Basics: Building Panels

To create multiple functional panels, we use CSS layout techniques like Flexbox or Grid.

Flexbox

  • Enables horizontal or vertical layouts
  • Automatically adjusts spacing
.container {
    display: flex;
}

Box Model

Every element consists of:

  • Content
  • Padding
  • Border
  • Margin

7 Multi-Panel Web Page (Example)

HTML Structure

<!DOCTYPE html>
<html>
<head>
    <title>Multi-Panel Page</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>

<header>
    <h1>My Dashboard</h1>
</header>

<div class="container">
    <nav class="sidebar">
        <ul>
            <li>Home</li>
            <li>Profile</li>
            <li>Settings</li>
        </ul>
    </nav>

    <main class="content">
        <h2>Main Content</h2>
        <p>This is the central panel.</p>
    </main>

    <aside class="panel">
        <h3>Extra Panel</h3>
        <p>Additional info here.</p>
    </aside>
</div>

<footer>
    <p>Footer information</p>
</footer>

</body>
</html>

Since the a code produces a standalone Webpage, we cannot include in this Markdown document.

8 HTML Tables

8.1 HTML Table With No CSS

Example 3-by-3 with table different column width and some merged cells.

<!DOCTYPE html>
<html>
<head>
    <title>Dashboard Table Layout</title>
</head>
<body>

<table border="1" width="100%" height="600">

    <!-- Header -->
    <tr>
        <td colspan="3" align="center">
            <center><h2>My Dashboard</h2></center>
        </td>
    </tr>

    <!-- Main Row -->
    <tr>

        <!-- Sidebar -->
        <td width="20%" valign="top">
            <ul>
                <li>Home</li>
                <li>Profile</li>
                <li>Settings</li>
            </ul>
        </td>

        <!-- Main Content -->
        <td width="60%" valign="top">
            <h3>Main Content</h3>
            <p>This is the central panel.</p>
        </td>

        <!-- Extra Panel -->
        <td width="20%" valign="top">
            <h3>Extra Panel</h3>
            <p>Additional info here.</p>
        </td>

    </tr>

    <!-- Footer -->
    <tr>
        <td colspan="3" align="center">
            Footer information
        </td>
    </tr>

</table>

</body>
</html>

My Dashboard

  • Home
  • Profile
  • Settings

Main Content

This is the central panel.

Extra Panel

Additional info here.

Footer information

8.2 HTML With Inline CSS

<!DOCTYPE html>
<html>
<head>
    <title>Dashboard Table Layout</title>
</head>
<body style="margin:0; font-family: Arial, sans-serif;">

<table style="width:100%; height:100vh; border-collapse:collapse;">

    <!-- Header -->
    <tr>
        <td colspan="3" 
            style="background-color:#2d1b3d; color:white; text-align:center; font-size:28px; font-weight:bold; height:80px;">
            My Dashboard
        </td>
    </tr>

    <!-- Main Row -->
    <tr>

        <!-- Sidebar -->
        <td style="background-color:#6E3061; color:white; width:20%; vertical-align:top; padding:15px;">
            <ul style="padding-left:20px;">
                <li>Home</li>
                <li>Profile</li>
                <li>Settings</li>
            </ul>
        </td>

        <!-- Main Content -->
        <td style="background-color:#d3d3d3; width:60%; vertical-align:top; padding:15px;">
            <h2>Main Content</h2>
            <p>This is the central panel.</p>
        </td>

        <!-- Extra Panel -->
        <td style="background-color:#bfbfbf; width:20%; vertical-align:top; padding:15px;">
            <h3>Extra Panel</h3>
            <p>Additional info here.</p>
        </td>

    </tr>

    <!-- Footer -->
    <tr>
        <td colspan="3" 
            style="background-color:#2d1b3d; color:white; text-align:center; height:50px;">
            Footer information
        </td>
    </tr>

</table>

</body>
</html>

The actual HTML table is rendered as follows.

My Dashboard
  • Home
  • Profile
  • Settings

Main Content

This is the central panel.

Extra Panel

Additional info here.

Footer information

8.3 HTML Table with An Internal CSS

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Dashboard Table Layout</title>
<style>
    body {
        margin: 0;
        font-family: Arial, sans-serif;
    }

    table {
        width: 100%;
        height: 100vh;
        border-collapse: collapse;
    }

    td {
        vertical-align: top;
        padding: 15px;
    }

    /* Header */
    .header {
        background-color: #2d1b3d;
        color: white;
        text-align: center;
        font-size: 28px;
        font-weight: bold;
        height: 80px;
    }

    /* Sidebar */
    .sidebar {
        background-color: #6E3061;
        color: white;
        width: 20%;
    }

    /* Main content */
    .main {
        background-color: #d3d3d3;
        width: 60%;
    }

    /* Right panel */
    .extra {
        background-color: #bfbfbf;
        width: 20%;
    }

    /* Footer */
    .footer {
        background-color: #2d1b3d;
        color: white;
        text-align: center;
        height: 50px;
    }

    ul {
        padding-left: 20px;
    }
</style>
</head>
<body>

<table>
    <!-- Header -->
    <tr>
        <td colspan="3" class="header">My Dashboard</td>
    </tr>

    <!-- Main Row -->
    <tr>
        <!-- Sidebar -->
        <td class="sidebar">
            <ul>
                <li>Home</li>
                <li>Profile</li>
                <li>Settings</li>
            </ul>
        </td>

        <!-- Main Content -->
        <td class="main">
            <h2>Main Content</h2>
            <p>This is the central panel.</p>
        </td>

        <!-- Extra Panel -->
        <td class="extra">
            <h3>Extra Panel</h3>
            <p>Additional info here.</p>
        </td>
    </tr>

    <!-- Footer -->
    <tr>
        <td colspan="3" class="footer">Footer information</td>
    </tr>
</table>

</body>
</html>
My Dashboard

Main Content

This is the central panel.

Extra Panel

Additional info here.

LS0tDQp0aXRsZTogIkhUTUwsIENTUywgYW5kIE11bHRpLVBhbmVsIFdlYiBQYWdlcyINCmF1dGhvcjogIkNoZW5nIFBlbmciDQpkYXRlOiAiV2VzdCBDaGVzdGVyIFVuaXZlcnNpdHkiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2NfY29sbGFwc2VkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMNCiAgICB0aGVtZTogbHVtZW4NCiAgcGRmX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIGZpZ193aWR0aDogMw0KICAgIGZpZ19oZWlnaHQ6IDMNCiAgd29yZF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAga2VlcF9tZDogeWVzDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUNCi0tLQ0KDQpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9DQoNCi8qIFN0eWxlIGZvciB0aGUgdG9nZ2xlIGJ1dHRvbiAqLw0KI3RvYy10b2dnbGUgew0KICBwb3NpdGlvbjogZml4ZWQ7DQogIHRvcDogNTBweDsNCiAgcmlnaHQ6IDQwcHg7DQogIHotaW5kZXg6IDEwMDA7DQogIHBhZGRpbmc6IDFweCAxcHg7DQogIGJhY2tncm91bmQtY29sb3I6ICNmOGY5ZmE7DQogIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7DQogIGJvcmRlci1yYWRpdXM6IDRweDsNCiAgY3Vyc29yOiBwb2ludGVyOw0KICBmb250LXNpemU6IDEycHg7DQogIGNvbG9yOiBkYXJrcmVkDQp9DQoNCi8qIFdoZW4gVE9DIGlzIGhpZGRlbiAqLw0KLnRvYy1oaWRkZW4gI1RPQyB7DQogIGRpc3BsYXk6IG5vbmU7DQp9DQoNCi8qIEFkanVzdCBtYWluIGNvbnRlbnQgd2hlbiBUT0MgaXMgaGlkZGVuICovDQoudG9jLWhpZGRlbiAubWFpbi1jb250YWluZXIgew0KICBtYXJnaW4tbGVmdDogMCAhaW1wb3J0YW50Ow0KICBtYXJnaW4tcmlnaHQ6IDAgIWltcG9ydGFudDsNCn0NCg0KLyogU21vb3RoIHRyYW5zaXRpb24gKi8NCiNUT0MsIC5tYWluLWNvbnRhaW5lciB7DQogIHRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7DQp9DQoNCg0KI1RPQzo6YmVmb3JlIHsNCiAgY29udGVudDogIlRhYmxlIG9mIENvbnRlbnRzIjsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtc2l6ZTogMS4yZW07DQogIGRpc3BsYXk6IGJsb2NrOw0KICBjb2xvcjogbmF2eTsNCiAgbWFyZ2luLWJvdHRvbTogMTBweDsNCn0NCg0KDQpkaXYjVE9DIGxpIHsgICAgIC8qIHRhYmxlIG9mIGNvbnRlbnQgICovDQogICAgbGlzdC1zdHlsZTp1cHBlci1yb21hbjsNCiAgICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7DQogICAgYmFja2dyb3VuZC1yZXBlYXQ6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7DQp9DQoNCmgxLnRpdGxlIHsgICAgLyogbGV2ZWwgMSBoZWFkZXIgb2YgdGl0bGUgICovDQogIGZvbnQtc2l6ZTogMjJweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsNCn0NCg0KaDQuYXV0aG9yIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxNXB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsNCiAgY29sb3I6IG5hdnk7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsNCiAgY29sb3I6IERhcmtCbHVlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmgxIHsgLyogSGVhZGVyIDEgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDIwcHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoMiB7IC8qIEhlYWRlciAyIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsgLyogSGVhZGVyIDMgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE2cHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDQgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KLyogQWRkIGRvdHMgYWZ0ZXIgbnVtYmVyZWQgaGVhZGVycyAqLw0KLmhlYWRlci1zZWN0aW9uLW51bWJlcjo6YWZ0ZXIgew0KICBjb250ZW50OiAiLiI7DQoNCmJvZHkge2JhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7DQogICAgICBjb2xvcjogIzAwMDAwMDsNCiAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsNCiAgICAgIGZvbnQtc2l6ZTogMXJlbTsNCiAgICAgIGxpbmUtaGVpZ2h0OiAxLjY7DQogICAgICB9DQoNCi5oaWdobGlnaHRtZSB7IGJhY2tncm91bmQtY29sb3I6eWVsbG93OyB9DQoNCnAgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCn0NCmBgYA0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KIyBjb2RlIGNodW5rIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBSIGNvZGUsIHdhcm5pbmdzLCBhbmQgb3V0cHV0IA0KIyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgZmlsZXMuDQppZiAoIXJlcXVpcmUoImtuaXRyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImtuaXRyIikNCiAgIGxpYnJhcnkoa25pdHIpDQp9DQoNCiMjIGxpYnJhcnkoSG1pc2MpDQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsICAgICAgICMgaW5jbHVkZSBjb2RlIGNodW5rIGluIHRoZSBvdXRwdXQgZmlsZQ0KICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcgPSBGQUxTRSwgICAjIHNvbWV0aW1lcywgeW91IGNvZGUgbWF5IHByb2R1Y2Ugd2FybmluZyBtZXNzYWdlcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB5b3UgY2FuIGNob29zZSB0byBpbmNsdWRlIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIGluDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGhlIG91dHB1dCBmaWxlLiANCiAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gVFJVRSwgICAgIyB5b3UgY2FuIGFsc28gZGVjaWRlIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgb3V0cHV0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaW4gdGhlIG91dHB1dCBmaWxlLg0KICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gTkENCiAgICAgICAgICAgICAgICAgICAgICApICANCg0KYGBgDQoNClwNCg0KIyBJbnRyb2R1Y3Rpb24NCg0KVGhlc2Ugbm90ZXMgcHJvdmlkZSBhIGNvbXByZWhlbnNpdmUgbWF0aGVtYXRpY2FsIGNoYXJhY3Rlcml6YXRpb24gb2YgaHlwb3RoZXNpcyB0ZXN0aW5nLCBjb3ZlcmluZyBhc3N1bXB0aW9ucywgcHJvY2VkdXJlcywgdHlwZXMsIHBlcmZvcm1hbmNlIG1lYXN1cmVzLCBlcnJvciB0eXBlcywgYW5kIHByYWN0aWNhbCBhcHBsaWNhdGlvbnMgd2l0aCBtYW51YWwgY2FsY3VsYXRpb25zIGFuZCBSIHZlcmlmaWNhdGlvbi4NCg0KIyBXaGF0IGlzIEhUTUw/IChTdHJ1Y3R1cmUpDQoNCkhUTUwgKEh5cGVyVGV4dCBNYXJrdXAgTGFuZ3VhZ2UpIGRlZmluZXMgdGhlIHN0cnVjdHVyZSBvZiBhIHdlYiBwYWdlLiBJdCB0ZWxscyB0aGUgYnJvd3NlciB3aGF0IGVsZW1lbnRzIGV4aXN0IGFuZCBob3cgY29udGVudCBpcyBvcmdhbml6ZWQuDQoNCg0KKipCYXNpYyBIVE1MIFNrZWxldG9uKioNCg0KYGBge2h0bWx9DQo8IURPQ1RZUEUgaHRtbD4gIDwhLS0gVGVsbHMgdGhlIGJyb3dzZXIgd2hpY2ggSFRNTCB2ZXJzaW9uIHRvIGV4cGVjdCAtLT4NCjxodG1sPg0KPGhlYWQ+DQogICAgPHRpdGxlPk15IEZpcnN0IFdlYiBQYWdlPC90aXRsZT4NCjwvaGVhZD4NCjxib2R5Pg0KICAgIDxoMT5XZWxjb21lPC9oMT4NCiAgICA8cD5UaGlzIGlzIGEgcGFyYWdyYXBoLjwvcD4NCjwvYm9keT4NCjwvaHRtbD4NCmBgYA0KDQoqKktleSBDb25jZXB0cyoqDQoNCiogYDxodG1sPmA6IFJvb3QgZWxlbWVudA0KKiBgPGhlYWQ+YDogTWV0YWRhdGEgKHRpdGxlLCBzdHlsZXMsIGxpbmtzKQ0KKiBgPGJvZHk+YDogVmlzaWJsZSBjb250ZW50DQoqIFRhZ3MgdXN1YWxseSBjb21lIGluIHBhaXJzOiBgPHRhZz4uLi48L3RhZz5gDQoNCg0KIyAyLiBDb21tb24gSFRNTCBFbGVtZW50cw0KDQoqKlRleHQgRWxlbWVudHMqKg0KDQpgYGB7aHRtbH0NCjxoMT5NYWluIEhlYWRpbmc8L2gxPg0KPGgyPlN1YmhlYWRpbmc8L2gyPg0KPHA+UGFyYWdyYXBoIHRleHQ8L3A+DQpgYGANCg0KKipMaXN0cyoqDQoNCmBgYHtodG1sfQ0KPHVsPg0KICA8bGk+SXRlbSAxPC9saT4NCiAgPGxpPkl0ZW0gMjwvbGk+DQo8L3VsPg0KYGBgDQoNCioqTGlua3MgYW5kIEltYWdlcyoqDQoNCmBgYHtodG1sfQ0KPGEgaHJlZj0iaHR0cHM6Ly9leGFtcGxlLmNvbSI+VmlzaXQgU2l0ZTwvYT4NCjxpbWcgc3JjPSJpbWFnZS5qcGciIGFsdD0iRGVzY3JpcHRpb24iPg0KYGBgDQoNCioqRGl2IGFuZCBTZWN0aW9uIChMYXlvdXQgQ29udGFpbmVycykqKg0KDQpgYGB7aHRtbH0NCjxkaXY+R2VuZXJpYyBjb250YWluZXI8L2Rpdj4NCjxzZWN0aW9uPlNlbWFudGljIHNlY3Rpb248L3NlY3Rpb24+DQpgYGANCg0KDQojIFdoYXQgaXMgQ1NTPyAoU3R5bGUpDQoNCkNTUyAoQ2FzY2FkaW5nIFN0eWxlIFNoZWV0cykgY29udHJvbHMgdGhlIGFwcGVhcmFuY2Ugb2YgSFRNTCBlbGVtZW50cy4NCg0KQmFzaWMgQ1NTIFN5bnRheA0KDQpgYGB7Y3NzfQ0Kc2VsZWN0b3Igew0KICAgIHByb3BlcnR5OiB2YWx1ZTsNCn0NCmBgYA0KDQoqKkV4YW1wbGUqKg0KDQpgYGB7aHRtbH0NCmJvZHkgew0KICAgIGJhY2tncm91bmQtY29sb3I6ICNmNGY0ZjQ7DQp9DQoNCmgxIHsNCiAgICBjb2xvcjogcHVycGxlOw0KfQ0KYGBgDQoNCiMgIFdheXMgdG8gQWRkIENTUw0KDQoqKklubGluZSoqDQoNCmBgYHtjc3N9DQo8cCBzdHlsZT0iY29sb3I6IHJlZDsiPlRleHQ8L3A+DQpgYGANCg0KKipJbnRlcm5hbCoqDQoNCmBgYHtjc3N9DQo8c3R5bGU+DQpwIHsgY29sb3I6IGJsdWU7IH0NCjwvc3R5bGU+DQpgYGANCg0KDQoqKkV4dGVybmFsIChCZXN0IFByYWN0aWNlKSoqDQoNCmBgYHtjc3N9DQo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9InN0eWxlcy5jc3MiPg0KYGBgDQoNCiMgTGF5b3V0IEJhc2ljczogQnVpbGRpbmcgUGFuZWxzDQoNClRvIGNyZWF0ZSBtdWx0aXBsZSBmdW5jdGlvbmFsIHBhbmVscywgd2UgdXNlIENTUyBsYXlvdXQgdGVjaG5pcXVlcyBsaWtlIEZsZXhib3ggb3IgR3JpZC4NCg0KKipGbGV4Ym94KioNCg0KKiBFbmFibGVzIGhvcml6b250YWwgb3IgdmVydGljYWwgbGF5b3V0cw0KKiBBdXRvbWF0aWNhbGx5IGFkanVzdHMgc3BhY2luZw0KDQpgYGB7Y3NzfQ0KLmNvbnRhaW5lciB7DQogICAgZGlzcGxheTogZmxleDsNCn0NCmBgYA0KDQoqKkJveCBNb2RlbCoqDQoNCkV2ZXJ5IGVsZW1lbnQgY29uc2lzdHMgb2Y6DQoNCiogQ29udGVudA0KKiBQYWRkaW5nDQoqIEJvcmRlcg0KKiBNYXJnaW4NCg0KIyBNdWx0aS1QYW5lbCBXZWIgUGFnZSAoRXhhbXBsZSkNCg0KKipIVE1MIFN0cnVjdHVyZSoqDQoNCmBgYHtodG1sfQ0KPCFET0NUWVBFIGh0bWw+DQo8aHRtbD4NCjxoZWFkPg0KICAgIDx0aXRsZT5NdWx0aS1QYW5lbCBQYWdlPC90aXRsZT4NCiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9InN0eWxlLmNzcyI+DQo8L2hlYWQ+DQo8Ym9keT4NCg0KPGhlYWRlcj4NCiAgICA8aDE+TXkgRGFzaGJvYXJkPC9oMT4NCjwvaGVhZGVyPg0KDQo8ZGl2IGNsYXNzPSJjb250YWluZXIiPg0KICAgIDxuYXYgY2xhc3M9InNpZGViYXIiPg0KICAgICAgICA8dWw+DQogICAgICAgICAgICA8bGk+SG9tZTwvbGk+DQogICAgICAgICAgICA8bGk+UHJvZmlsZTwvbGk+DQogICAgICAgICAgICA8bGk+U2V0dGluZ3M8L2xpPg0KICAgICAgICA8L3VsPg0KICAgIDwvbmF2Pg0KDQogICAgPG1haW4gY2xhc3M9ImNvbnRlbnQiPg0KICAgICAgICA8aDI+TWFpbiBDb250ZW50PC9oMj4NCiAgICAgICAgPHA+VGhpcyBpcyB0aGUgY2VudHJhbCBwYW5lbC48L3A+DQogICAgPC9tYWluPg0KDQogICAgPGFzaWRlIGNsYXNzPSJwYW5lbCI+DQogICAgICAgIDxoMz5FeHRyYSBQYW5lbDwvaDM+DQogICAgICAgIDxwPkFkZGl0aW9uYWwgaW5mbyBoZXJlLjwvcD4NCiAgICA8L2FzaWRlPg0KPC9kaXY+DQoNCjxmb290ZXI+DQogICAgPHA+Rm9vdGVyIGluZm9ybWF0aW9uPC9wPg0KPC9mb290ZXI+DQoNCjwvYm9keT4NCjwvaHRtbD4NCmBgYA0KDQpTaW5jZSB0aGUgYSBjb2RlIHByb2R1Y2VzIGEgc3RhbmRhbG9uZSBXZWJwYWdlLCB3ZSBjYW5ub3QgaW5jbHVkZSBpbiB0aGlzIE1hcmtkb3duIGRvY3VtZW50Lg0KDQoNCg0KDQoNCiMgSFRNTCBUYWJsZXMNCg0KIyMgSFRNTCBUYWJsZSBXaXRoIE5vIENTUw0KDQoqKkV4YW1wbGUqKiAzLWJ5LTMgd2l0aCB0YWJsZSBkaWZmZXJlbnQgY29sdW1uIHdpZHRoIGFuZCBzb21lIG1lcmdlZCBjZWxscy4NCg0KYGBge2h0bWx9DQo8IURPQ1RZUEUgaHRtbD4NCjxodG1sPg0KPGhlYWQ+DQogICAgPHRpdGxlPkRhc2hib2FyZCBUYWJsZSBMYXlvdXQ8L3RpdGxlPg0KPC9oZWFkPg0KPGJvZHk+DQoNCjx0YWJsZSBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjYwMCI+DQoNCiAgICA8IS0tIEhlYWRlciAtLT4NCiAgICA8dHI+DQogICAgICAgIDx0ZCBjb2xzcGFuPSIzIiBhbGlnbj0iY2VudGVyIj4NCiAgICAgICAgICAgIDxjZW50ZXI+PGgyPk15IERhc2hib2FyZDwvaDI+PC9jZW50ZXI+DQogICAgICAgIDwvdGQ+DQogICAgPC90cj4NCg0KICAgIDwhLS0gTWFpbiBSb3cgLS0+DQogICAgPHRyPg0KDQogICAgICAgIDwhLS0gU2lkZWJhciAtLT4NCiAgICAgICAgPHRkIHdpZHRoPSIyMCUiIHZhbGlnbj0idG9wIj4NCiAgICAgICAgICAgIDx1bD4NCiAgICAgICAgICAgICAgICA8bGk+SG9tZTwvbGk+DQogICAgICAgICAgICAgICAgPGxpPlByb2ZpbGU8L2xpPg0KICAgICAgICAgICAgICAgIDxsaT5TZXR0aW5nczwvbGk+DQogICAgICAgICAgICA8L3VsPg0KICAgICAgICA8L3RkPg0KDQogICAgICAgIDwhLS0gTWFpbiBDb250ZW50IC0tPg0KICAgICAgICA8dGQgd2lkdGg9IjYwJSIgdmFsaWduPSJ0b3AiPg0KICAgICAgICAgICAgPGgzPk1haW4gQ29udGVudDwvaDM+DQogICAgICAgICAgICA8cD5UaGlzIGlzIHRoZSBjZW50cmFsIHBhbmVsLjwvcD4NCiAgICAgICAgPC90ZD4NCg0KICAgICAgICA8IS0tIEV4dHJhIFBhbmVsIC0tPg0KICAgICAgICA8dGQgd2lkdGg9IjIwJSIgdmFsaWduPSJ0b3AiPg0KICAgICAgICAgICAgPGgzPkV4dHJhIFBhbmVsPC9oMz4NCiAgICAgICAgICAgIDxwPkFkZGl0aW9uYWwgaW5mbyBoZXJlLjwvcD4NCiAgICAgICAgPC90ZD4NCg0KICAgIDwvdHI+DQoNCiAgICA8IS0tIEZvb3RlciAtLT4NCiAgICA8dHI+DQogICAgICAgIDx0ZCBjb2xzcGFuPSIzIiBhbGlnbj0iY2VudGVyIj4NCiAgICAgICAgICAgIEZvb3RlciBpbmZvcm1hdGlvbg0KICAgICAgICA8L3RkPg0KICAgIDwvdHI+DQoNCjwvdGFibGU+DQoNCjwvYm9keT4NCjwvaHRtbD4NCmBgYA0KDQoNCjx0YWJsZSBib3JkZXI9IjIiIGJvcmRlcmNvbG9yPSAicmVkIiB3aWR0aD0iODAlIiBoZWlnaHQ9IjQwMCI+DQogICAgPCEtLSBIZWFkZXIgLS0+DQogICAgPHRyPg0KICAgICAgICA8dGQgIGNvbHNwYW4gPSAiMyIgYWxpZ249ImNlbnRlciI+DQogICAgICAgICAgICA8aDI+PGNlbnRlcj5NeSBEYXNoYm9hcmQ8L2NlbnRlcj48L2gyPg0KICAgICAgICA8L3RkPg0KICAgIDwvdHI+DQogICAgPCEtLSBNYWluIFJvdyAtLT4NCiAgICA8dHI+DQogICAgICAgIDwhLS0gU2lkZWJhciAtLT4NCiAgICAgICAgPHRkIHdpZHRoPSIyMCUiIHZhbGlnbj0idG9wIj4NCiAgICAgICAgICAgIDx1bD4NCiAgICAgICAgICAgICAgICA8bGk+SG9tZTwvbGk+DQogICAgICAgICAgICAgICAgPGxpPlByb2ZpbGU8L2xpPg0KICAgICAgICAgICAgICAgIDxsaT5TZXR0aW5nczwvbGk+DQogICAgICAgICAgICA8L3VsPg0KICAgICAgICA8L3RkPg0KICAgICAgICA8IS0tIE1haW4gQ29udGVudCAtLT4NCiAgICAgICAgPHRkIHdpZHRoPSI2MCUiIHZhbGlnbj0idG9wIj4NCiAgICAgICAgICAgIDxoMz5NYWluIENvbnRlbnQ8L2gzPg0KICAgICAgICAgICAgPHA+VGhpcyBpcyB0aGUgY2VudHJhbCBwYW5lbC48L3A+DQogICAgICAgIDwvdGQ+DQogICAgICAgIDwhLS0gRXh0cmEgUGFuZWwgLS0+DQogICAgICAgIDx0ZCB3aWR0aD0iMjAlIiB2YWxpZ249InRvcCI+DQogICAgICAgICAgICA8aDM+RXh0cmEgUGFuZWw8L2gzPg0KICAgICAgICAgICAgPHA+QWRkaXRpb25hbCBpbmZvIGhlcmUuPC9wPg0KICAgICAgICA8L3RkPg0KICAgIDwvdHI+DQogICAgPCEtLSBGb290ZXIgLS0+DQogICAgPHRyPg0KICAgICAgICA8dGQgY29sc3Bhbj0iMyIgYWxpZ249ImNlbnRlciI+DQogICAgICAgICAgICBGb290ZXIgaW5mb3JtYXRpb24NCiAgICAgICAgPC90ZD4NCiAgICA8L3RyPg0KPC90YWJsZT4NCg0KDQojIyBIVE1MIFdpdGggSW5saW5lIENTUw0KDQpgYGB7aHRtbH0NCjwhRE9DVFlQRSBodG1sPg0KPGh0bWw+DQo8aGVhZD4NCiAgICA8dGl0bGU+RGFzaGJvYXJkIFRhYmxlIExheW91dDwvdGl0bGU+DQo8L2hlYWQ+DQo8Ym9keSBzdHlsZT0ibWFyZ2luOjA7IGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsiPg0KDQo8dGFibGUgc3R5bGU9IndpZHRoOjEwMCU7IGhlaWdodDoxMDB2aDsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyI+DQoNCiAgICA8IS0tIEhlYWRlciAtLT4NCiAgICA8dHI+DQogICAgICAgIDx0ZCBjb2xzcGFuPSIzIiANCiAgICAgICAgICAgIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiMyZDFiM2Q7IGNvbG9yOndoaXRlOyB0ZXh0LWFsaWduOmNlbnRlcjsgZm9udC1zaXplOjI4cHg7IGZvbnQtd2VpZ2h0OmJvbGQ7IGhlaWdodDo4MHB4OyI+DQogICAgICAgICAgICBNeSBEYXNoYm9hcmQNCiAgICAgICAgPC90ZD4NCiAgICA8L3RyPg0KDQogICAgPCEtLSBNYWluIFJvdyAtLT4NCiAgICA8dHI+DQoNCiAgICAgICAgPCEtLSBTaWRlYmFyIC0tPg0KICAgICAgICA8dGQgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IzZFMzA2MTsgY29sb3I6d2hpdGU7IHdpZHRoOjIwJTsgdmVydGljYWwtYWxpZ246dG9wOyBwYWRkaW5nOjE1cHg7Ij4NCiAgICAgICAgICAgIDx1bCBzdHlsZT0icGFkZGluZy1sZWZ0OjIwcHg7Ij4NCiAgICAgICAgICAgICAgICA8bGk+SG9tZTwvbGk+DQogICAgICAgICAgICAgICAgPGxpPlByb2ZpbGU8L2xpPg0KICAgICAgICAgICAgICAgIDxsaT5TZXR0aW5nczwvbGk+DQogICAgICAgICAgICA8L3VsPg0KICAgICAgICA8L3RkPg0KDQogICAgICAgIDwhLS0gTWFpbiBDb250ZW50IC0tPg0KICAgICAgICA8dGQgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6I2QzZDNkMzsgd2lkdGg6NjAlOyB2ZXJ0aWNhbC1hbGlnbjp0b3A7IHBhZGRpbmc6MTVweDsiPg0KICAgICAgICAgICAgPGgyPk1haW4gQ29udGVudDwvaDI+DQogICAgICAgICAgICA8cD5UaGlzIGlzIHRoZSBjZW50cmFsIHBhbmVsLjwvcD4NCiAgICAgICAgPC90ZD4NCg0KICAgICAgICA8IS0tIEV4dHJhIFBhbmVsIC0tPg0KICAgICAgICA8dGQgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6I2JmYmZiZjsgd2lkdGg6MjAlOyB2ZXJ0aWNhbC1hbGlnbjp0b3A7IHBhZGRpbmc6MTVweDsiPg0KICAgICAgICAgICAgPGgzPkV4dHJhIFBhbmVsPC9oMz4NCiAgICAgICAgICAgIDxwPkFkZGl0aW9uYWwgaW5mbyBoZXJlLjwvcD4NCiAgICAgICAgPC90ZD4NCg0KICAgIDwvdHI+DQoNCiAgICA8IS0tIEZvb3RlciAtLT4NCiAgICA8dHI+DQogICAgICAgIDx0ZCBjb2xzcGFuPSIzIiANCiAgICAgICAgICAgIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiMyZDFiM2Q7IGNvbG9yOndoaXRlOyB0ZXh0LWFsaWduOmNlbnRlcjsgaGVpZ2h0OjUwcHg7Ij4NCiAgICAgICAgICAgIEZvb3RlciBpbmZvcm1hdGlvbg0KICAgICAgICA8L3RkPg0KICAgIDwvdHI+DQoNCjwvdGFibGU+DQoNCjwvYm9keT4NCjwvaHRtbD4NCmBgYA0KDQo8Zm9udCBjb2xvciA9ICJyZWQiPlRoZSBhY3R1YWwgSFRNTCB0YWJsZSBpcyByZW5kZXJlZCBhcyBmb2xsb3dzLjwvZm9udD4NCg0KDQoNCjx0YWJsZSBzdHlsZT0id2lkdGg6MTAwJTsgaGVpZ2h0OjEwMHZoOyBib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Ij4NCiAgICA8IS0tIEhlYWRlciAtLT4NCiAgICA8dHI+DQogICAgICAgIDx0ZCBjb2xzcGFuPSIzIiANCiAgICAgICAgICAgIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiMyZDFiM2Q7IGNvbG9yOndoaXRlOyB0ZXh0LWFsaWduOmNlbnRlcjsgZm9udC1zaXplOjI4cHg7IGZvbnQtd2VpZ2h0OmJvbGQ7IGhlaWdodDo4MHB4OyI+DQogICAgICAgICAgICBNeSBEYXNoYm9hcmQNCiAgICAgICAgPC90ZD4NCiAgICA8L3RyPg0KICAgIDwhLS0gTWFpbiBSb3cgLS0+DQogICAgPHRyPg0KICAgICAgICA8IS0tIFNpZGViYXIgLS0+DQogICAgICAgIDx0ZCBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjojNkUzMDYxOyBjb2xvcjp3aGl0ZTsgd2lkdGg6MjAlOyB2ZXJ0aWNhbC1hbGlnbjp0b3A7IHBhZGRpbmc6MTVweDsiPg0KICAgICAgICAgICAgPHVsIHN0eWxlPSJwYWRkaW5nLWxlZnQ6MjBweDsiPg0KICAgICAgICAgICAgICAgIDxsaT5Ib21lPC9saT4NCiAgICAgICAgICAgICAgICA8bGk+UHJvZmlsZTwvbGk+DQogICAgICAgICAgICAgICAgPGxpPlNldHRpbmdzPC9saT4NCiAgICAgICAgICAgIDwvdWw+DQogICAgICAgIDwvdGQ+DQogICAgICAgIDwhLS0gTWFpbiBDb250ZW50IC0tPg0KICAgICAgICA8dGQgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6I2QzZDNkMzsgd2lkdGg6NjAlOyB2ZXJ0aWNhbC1hbGlnbjp0b3A7IHBhZGRpbmc6MTVweDsiPg0KICAgICAgICAgICAgPGgyPk1haW4gQ29udGVudDwvaDI+DQogICAgICAgICAgICA8cD5UaGlzIGlzIHRoZSBjZW50cmFsIHBhbmVsLjwvcD4NCiAgICAgICAgPC90ZD4NCiAgICAgICAgPCEtLSBFeHRyYSBQYW5lbCAtLT4NCiAgICAgICAgPHRkIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiNiZmJmYmY7IHdpZHRoOjIwJTsgdmVydGljYWwtYWxpZ246dG9wOyBwYWRkaW5nOjE1cHg7Ij4NCiAgICAgICAgICAgIDxoMz5FeHRyYSBQYW5lbDwvaDM+DQogICAgICAgICAgICA8cD5BZGRpdGlvbmFsIGluZm8gaGVyZS48L3A+DQogICAgICAgIDwvdGQ+DQogICAgPC90cj4NCiAgICA8IS0tIEZvb3RlciAtLT4NCiAgICA8dHI+DQogICAgICAgIDx0ZCBjb2xzcGFuPSIzIiANCiAgICAgICAgICAgIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiMyZDFiM2Q7IGNvbG9yOndoaXRlOyB0ZXh0LWFsaWduOmNlbnRlcjsgaGVpZ2h0OjUwcHg7Ij4NCiAgICAgICAgICAgIEZvb3RlciBpbmZvcm1hdGlvbg0KICAgICAgICA8L3RkPg0KICAgIDwvdHI+DQo8L3RhYmxlPg0KDQoNCiMjIEhUTUwgVGFibGUgd2l0aCBBbiBJbnRlcm5hbCBDU1MNCg0KYGBge2h0bWx9DQo8IURPQ1RZUEUgaHRtbD4NCjxodG1sIGxhbmc9ImVuIj4NCjxoZWFkPg0KPG1ldGEgY2hhcnNldD0iVVRGLTgiPg0KPHRpdGxlPkRhc2hib2FyZCBUYWJsZSBMYXlvdXQ8L3RpdGxlPg0KPHN0eWxlPg0KICAgIGJvZHkgew0KICAgICAgICBtYXJnaW46IDA7DQogICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsNCiAgICB9DQoNCiAgICB0YWJsZSB7DQogICAgICAgIHdpZHRoOiAxMDAlOw0KICAgICAgICBoZWlnaHQ6IDEwMHZoOw0KICAgICAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOw0KICAgIH0NCg0KICAgIHRkIHsNCiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsNCiAgICAgICAgcGFkZGluZzogMTVweDsNCiAgICB9DQoNCiAgICAvKiBIZWFkZXIgKi8NCiAgICAuaGVhZGVyIHsNCiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzJkMWIzZDsNCiAgICAgICAgY29sb3I6IHdoaXRlOw0KICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgICAgIGZvbnQtc2l6ZTogMjhweDsNCiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgICAgIGhlaWdodDogODBweDsNCiAgICB9DQoNCiAgICAvKiBTaWRlYmFyICovDQogICAgLnNpZGViYXIgew0KICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNkUzMDYxOw0KICAgICAgICBjb2xvcjogd2hpdGU7DQogICAgICAgIHdpZHRoOiAyMCU7DQogICAgfQ0KDQogICAgLyogTWFpbiBjb250ZW50ICovDQogICAgLm1haW4gew0KICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDNkM2QzOw0KICAgICAgICB3aWR0aDogNjAlOw0KICAgIH0NCg0KICAgIC8qIFJpZ2h0IHBhbmVsICovDQogICAgLmV4dHJhIHsNCiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2JmYmZiZjsNCiAgICAgICAgd2lkdGg6IDIwJTsNCiAgICB9DQoNCiAgICAvKiBGb290ZXIgKi8NCiAgICAuZm9vdGVyIHsNCiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzJkMWIzZDsNCiAgICAgICAgY29sb3I6IHdoaXRlOw0KICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgICAgIGhlaWdodDogNTBweDsNCiAgICB9DQoNCiAgICB1bCB7DQogICAgICAgIHBhZGRpbmctbGVmdDogMjBweDsNCiAgICB9DQo8L3N0eWxlPg0KPC9oZWFkPg0KPGJvZHk+DQoNCjx0YWJsZT4NCiAgICA8IS0tIEhlYWRlciAtLT4NCiAgICA8dHI+DQogICAgICAgIDx0ZCBjb2xzcGFuPSIzIiBjbGFzcz0iaGVhZGVyIj5NeSBEYXNoYm9hcmQ8L3RkPg0KICAgIDwvdHI+DQoNCiAgICA8IS0tIE1haW4gUm93IC0tPg0KICAgIDx0cj4NCiAgICAgICAgPCEtLSBTaWRlYmFyIC0tPg0KICAgICAgICA8dGQgY2xhc3M9InNpZGViYXIiPg0KICAgICAgICAgICAgPHVsPg0KICAgICAgICAgICAgICAgIDxsaT5Ib21lPC9saT4NCiAgICAgICAgICAgICAgICA8bGk+UHJvZmlsZTwvbGk+DQogICAgICAgICAgICAgICAgPGxpPlNldHRpbmdzPC9saT4NCiAgICAgICAgICAgIDwvdWw+DQogICAgICAgIDwvdGQ+DQoNCiAgICAgICAgPCEtLSBNYWluIENvbnRlbnQgLS0+DQogICAgICAgIDx0ZCBjbGFzcz0ibWFpbiI+DQogICAgICAgICAgICA8aDI+TWFpbiBDb250ZW50PC9oMj4NCiAgICAgICAgICAgIDxwPlRoaXMgaXMgdGhlIGNlbnRyYWwgcGFuZWwuPC9wPg0KICAgICAgICA8L3RkPg0KDQogICAgICAgIDwhLS0gRXh0cmEgUGFuZWwgLS0+DQogICAgICAgIDx0ZCBjbGFzcz0iZXh0cmEiPg0KICAgICAgICAgICAgPGgzPkV4dHJhIFBhbmVsPC9oMz4NCiAgICAgICAgICAgIDxwPkFkZGl0aW9uYWwgaW5mbyBoZXJlLjwvcD4NCiAgICAgICAgPC90ZD4NCiAgICA8L3RyPg0KDQogICAgPCEtLSBGb290ZXIgLS0+DQogICAgPHRyPg0KICAgICAgICA8dGQgY29sc3Bhbj0iMyIgY2xhc3M9ImZvb3RlciI+Rm9vdGVyIGluZm9ybWF0aW9uPC90ZD4NCiAgICA8L3RyPg0KPC90YWJsZT4NCg0KPC9ib2R5Pg0KPC9odG1sPg0KYGBgDQoNCmBgYHtjc3MgZWNobyA9IEZBTFNFfQ0KPHN0eWxlPg0KICAgIGJvZHkgew0KICAgICAgICBtYXJnaW46IDA7DQogICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsNCiAgICB9DQoNCiAgICB0YWJsZSB7DQogICAgICAgIHdpZHRoOiAxMDAlOw0KICAgICAgICBoZWlnaHQ6IDEwMHZoOw0KICAgICAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOw0KICAgIH0NCg0KICAgIHRkIHsNCiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsNCiAgICAgICAgcGFkZGluZzogMTVweDsNCiAgICB9DQoNCiAgICAvKiBIZWFkZXIgKi8NCiAgICAuaGVhZGVyIHsNCiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzJkMWIzZDsNCiAgICAgICAgY29sb3I6IHdoaXRlOw0KICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgICAgIGZvbnQtc2l6ZTogMjhweDsNCiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgICAgIGhlaWdodDogODBweDsNCiAgICB9DQoNCiAgICAvKiBTaWRlYmFyICovDQogICAgLnNpZGViYXIgew0KICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNkUzMDYxOw0KICAgICAgICBjb2xvcjogd2hpdGU7DQogICAgICAgIHdpZHRoOiAyMCU7DQogICAgfQ0KDQogICAgLyogTWFpbiBjb250ZW50ICovDQogICAgLm1haW4gew0KICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDNkM2QzOw0KICAgICAgICB3aWR0aDogNjAlOw0KICAgIH0NCg0KICAgIC8qIFJpZ2h0IHBhbmVsICovDQogICAgLmV4dHJhIHsNCiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2JmYmZiZjsNCiAgICAgICAgd2lkdGg6IDIwJTsNCiAgICB9DQoNCiAgICAvKiBGb290ZXIgKi8NCiAgICAuZm9vdGVyIHsNCiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzJkMWIzZDsNCiAgICAgICAgY29sb3I6IHdoaXRlOw0KICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgICAgIGhlaWdodDogNTBweDsNCiAgICB9DQoNCiAgICB1bCB7DQogICAgICAgIHBhZGRpbmctbGVmdDogMjBweDsNCiAgICB9DQo8L3N0eWxlPg0KYGBgDQoNCg0KPHRhYmxlPg0KICAgIDwhLS0gSGVhZGVyIC0tPg0KICAgIDx0cj4NCiAgICAgICAgPHRkIGNvbHNwYW49IjMiIGNsYXNzPSJoZWFkZXIiPk15IERhc2hib2FyZDwvdGQ+DQogICAgPC90cj4NCiAgICA8IS0tIE1haW4gUm93IC0tPg0KICAgIDx0cj4NCiAgICAgICAgPCEtLSBTaWRlYmFyIC0tPg0KICAgICAgICA8dGQgY2xhc3M9InNpZGViYXIiPg0KICAgICAgICAgICAgPHVsPg0KICAgICAgICAgICAgICAgIDxsaT5Ib21lPC9saT4NCiAgICAgICAgICAgICAgICA8bGk+UHJvZmlsZTwvbGk+DQogICAgICAgICAgICAgICAgPGxpPlNldHRpbmdzPC9saT4NCiAgICAgICAgICAgIDwvdWw+DQogICAgICAgIDwvdGQ+DQogICAgICAgIDwhLS0gTWFpbiBDb250ZW50IC0tPg0KICAgICAgICA8dGQgY2xhc3M9Im1haW4iPg0KICAgICAgICAgICAgPGgyPk1haW4gQ29udGVudDwvaDI+DQogICAgICAgICAgICA8cD5UaGlzIGlzIHRoZSBjZW50cmFsIHBhbmVsLjwvcD4NCiAgICAgICAgPC90ZD4NCiAgICAgICAgPCEtLSBFeHRyYSBQYW5lbCAtLT4NCiAgICAgICAgPHRkIGNsYXNzPSJleHRyYSI+DQogICAgICAgICAgICA8aDM+RXh0cmEgUGFuZWw8L2gzPg0KICAgICAgICAgICAgPHA+QWRkaXRpb25hbCBpbmZvIGhlcmUuPC9wPg0KICAgICAgICA8L3RkPg0KICAgIDwvdHI+DQogICAgPCEtLSBGb290ZXIgLS0+DQogICAgPHRyPg0KICAgICAgICA8dGQgY29sc3Bhbj0iMyIgY2xhc3M9ImZvb3RlciI+Rm9vdGVyIGluZm9ybWF0aW9uPC90ZD4NCiAgICA8L3RyPg0KPC90YWJsZT4NCg0KDQo=