{
  "resourceType" : "Library",
  "id" : "CXCAElements",
  "meta" : {
    "profile" : ["http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-shareablelibrary",
    "http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-publishablelibrary",
    "http://hl7.org/fhir/uv/cql/StructureDefinition/cql-library",
    "http://hl7.org/fhir/uv/cql/StructureDefinition/cql-module"]
  },
  "text" : {
    "status" : "extensions",
    "div" : "<div xmlns=\"http://www.w3.org/1999/xhtml\">\n<div>\n    <table class=\"grid dict\">\n        \n        \n        <tr>\n            <th scope=\"row\"><b>Title: </b></th>\n            <td style=\"padding-left: 4px;\">CXCAElements</td>\n        </tr>\n        \n\n        \n        \n        <tr>\n            <th scope=\"row\"><b>Id: </b></th>\n            <td style=\"padding-left: 4px;\">CXCAElements</td>\n        </tr>\n        \n\n        \n        \n        <tr>\n            <th scope=\"row\"><b>Version: </b></th>\n            <td style=\"padding-left: 4px;\">0.0.1</td>\n        </tr>\n        \n\n        \n        <tr>\n            <th scope=\"row\"><b>Url: </b></th>\n            <td style=\"padding-left: 4px;\"><a href=\"Library-CXCAElements.html\">CXCAElements</a></td>\n        </tr>\n        \n\n        \n\n        \n\n        \n        <tr>\n            <th scope=\"row\"><b>Status: </b></th>\n            <td style=\"padding-left: 4px;\">draft</td>\n        </tr>\n        \n\n        \n\n        \n        <tr>\n            <th scope=\"row\"><b>Type: </b></th>\n            <td style=\"padding-left: 4px;\">\n                \n                    \n                        \n                        <p style=\"margin-bottom: 5px;\">\n                            <b>system: </b> <span><a href=\"http://terminology.hl7.org/7.1.0/CodeSystem-library-type.html\">http://terminology.hl7.org/CodeSystem/library-type</a></span>\n                        </p>\n                        \n                        \n                        <p style=\"margin-bottom: 5px;\">\n                            <b>code: </b> <span>logic-library</span>\n                        </p>\n                        \n                        \n                    \n                \n                \n            </td>\n        </tr>\n        \n\n        \n\n        \n        <tr>\n            <th scope=\"row\"><b>Date: </b></th>\n            <td style=\"padding-left: 4px;\">2026-05-14 00:50:23+0000</td>\n        </tr>\n        \n\n        \n        <tr>\n            <th scope=\"row\"><b>Publisher: </b></th>\n            <td style=\"padding-left: 4px;\">Dan Heslinga (independent contributor)</td>\n        </tr>\n        \n\n        \n        <tr>\n            <th scope=\"row\"><b>Description: </b></th>\n            <td style=\"padding-left: 4px;\"><div><p>Shared CQL elements library for the cervical cancer screening DAK. Provides per-patient predicates and counts derived from FHIR resources (Patient, Procedure, Observation, ServiceRequest); consumed by both CDS-side Logic libraries and eCQM-side Indicator libraries to materialize the harmonization pattern from the eCQM/CDS paper. Source CQL is at input/cql/CXCAElements.cql.</p>\n</div></td>\n        </tr>\n        \n\n        \n\n        \n\n        \n\n        \n\n        \n\n        \n\n        \n\n        \n\n        \n\n        \n\n        \n\n        \n        <tr>\n          <th scope=\"row\"><b>Parameters: </b></th>\n          <td style=\"padding-left: 4px;\">\n            <table class=\"grid-dict\">\n              <tr><th><b>Name</b></th><th><b>Type</b></th><th><b>Min</b></th><th><b>Max</b></th><th><b>In/Out</b></th></tr>\n              \n                <tr><th>Patient</th><th>Patient</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n                <tr><th>Current Patient Age In Years</th><th>integer</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n                <tr><th>Hysterectomy Procedures</th><th>Procedure</th><th>0</th><th>*</th><th>Out</th></tr>\n              \n                <tr><th>Has Had Hysterectomy</th><th>boolean</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n            </table>\n          </td>\n        </tr>\n        \n\n        \n        <tr>\n          <th scope=\"row\"><b>Data Requirements:</b></th>\n          <td style=\"padding-left: 4px;\">\n            <table class=\"grid-dict\">\n              <tr><th><b>Type</b></th><th><b>Profile</b></th><th><b>MS</b></th><th><b>Code Filter</b></th></tr>\n              \n                <tr>\n                  <th>Procedure</th>\n                  <th>http://hl7.org/fhir/StructureDefinition/Procedure</th>\n                  <th/>\n                  <th>\n                    \n                  </th>\n                </tr>\n              \n            </table>\n          </td>\n        </tr>\n        \n\n        \n        \n        <tr>\n          <td colspan=\"2\">\n            <table>\n              <tr><th><a id=\"cql-content\"><b>Content: </b></a> text/cql</th></tr>\n              <tr><td><pre><code class=\"language-cql\">/*\n * Library: CXCAElements\n *\n * THE HARMONIZATION LAYER.\n *\n * A shared CQL library that provides per-patient predicates and counts derived\n * from FHIR resources, consumed by both the CDS-side Logic libraries (e.g.,\n * CXCAD2DTScreeningEligibilityLogic) and the eCQM-side Indicator libraries\n * (e.g., CXCAIND01Logic). The defines below are the single source of truth\n * for what counts as &quot;an HPV+ result,&quot; &quot;a documented hysterectomy,&quot; etc.\n *\n * METHODOLOGY POINT (the harmonization paper distilled):\n *\n *   When CDS asks &quot;is this patient due for screening today?&quot; and an eCQM asks\n *   &quot;what % of the cohort got screened in the period?&quot;, they ask different\n *   *aggregations* of the same underlying clinical fact: &quot;did this patient\n *   get screened?&quot; If both consumers compute that fact independently, they\n *   can drift — and the report stops aligning with the rule that drove the\n *   care. The fix is to define the underlying fact ONCE in a shared layer\n *   and have both consumers reference it.\n *\n *   IMMZ realizes this with `IMMZElements` and disease-specific\n *   `IMMZD2DTMeasles*Elements` libraries. We mirror that pattern here.\n *\n * Phase 5 chunk 8 — initial demonstration set. Currently only &quot;Has Had\n * Hysterectomy&quot; is materialized as a real FHIR query (Procedure with\n * CXCA.D#DE45). Subsequent iterations will add:\n *   - Per-period HPV result existence (with positive/negative value check)\n *   - Per-period cytology result existence (with Bethesda value check)\n *   - Per-period HPV-not-done existence (the Phase 4 NotDone pattern)\n *   - Time-window helpers (hasResultWithin, isExpectedButMissingFor)\n *\n * Each new define replaces a placeholder Boolean parameter in a downstream\n * library — this is the per-iteration migration path from placeholder-CQL\n * to real-FHIR-query-CQL.\n */\n\nlibrary CXCAElements version '0.0.1'\n\nusing FHIR version '4.0.1'\n\ninclude FHIRHelpers version '4.0.1'\n\ncontext Patient\n\n// =============================================================================\n// Patient demographics\n// =============================================================================\n\n/*\n * Current patient age in years.\n */\ndefine &quot;Current Patient Age In Years&quot;:\n  AgeInYears()\n\n// =============================================================================\n// Hysterectomy history\n// =============================================================================\n\n/*\n * @internal: All recorded hysterectomy procedures for this patient,\n *   filtered to status = completed.\n */\ndefine &quot;Hysterectomy Procedures&quot;:\n  [Procedure] P\n    where P.status = 'completed'\n      and exists (P.code.coding C where C.code = 'DE45'\n                                     and C.system = 'http://smart.who.int/cxca/CodeSystem/CXCA.D')\n\n/*\n * The patient has a documented completed hysterectomy.\n *\n * NOTE: A/641 section 2.2 only excludes hysterectomy for non-cervical-cancer indication\n * with a documented negative post-op vaginal-smear cytology. This define\n * captures only the hysterectomy fact; the indication and post-op cytology\n * checks live in higher-layer logic that combines this define with others.\n */\ndefine &quot;Has Had Hysterectomy&quot;:\n  exists &quot;Hysterectomy Procedures&quot;\n</code></pre></td></tr>\n            </table>\n          </td>\n        </tr>\n        \n        \n        \n        \n        \n        <tr>\n          <td colspan=\"2\">\n            <table>\n              <tr><th><b>Content: </b> application/elm+xml</th></tr>\n              <tr><td><pre><code>Encoded data (20720 characters)</code></pre></td></tr>\n            </table>\n          </td>\n        </tr>\n        \n        \n    </table>\n</div>\n</div>"
  },
  "extension" : [{
    "url" : "http://hl7.org/fhir/StructureDefinition/cqf-knowledgeCapability",
    "valueCode" : "computable"
  }],
  "url" : "http://smart.who.int/cxca/Library/CXCAElements",
  "version" : "0.0.1",
  "name" : "CXCAElements",
  "title" : "CXCAElements",
  "status" : "draft",
  "experimental" : false,
  "type" : {
    "coding" : [{
      "system" : "http://terminology.hl7.org/CodeSystem/library-type",
      "code" : "logic-library"
    }]
  },
  "date" : "2026-05-14T00:50:23+00:00",
  "publisher" : "Dan Heslinga (independent contributor)",
  "contact" : [{
    "name" : "Dan Heslinga (independent contributor)",
    "telecom" : [{
      "system" : "url",
      "value" : "https://github.com/dhes"
    }]
  }],
  "description" : "Shared CQL elements library for the cervical cancer screening DAK. Provides per-patient predicates and counts derived from FHIR resources (Patient, Procedure, Observation, ServiceRequest); consumed by both CDS-side Logic libraries and eCQM-side Indicator libraries to materialize the harmonization pattern from the eCQM/CDS paper. Source CQL is at input/cql/CXCAElements.cql.",
  "parameter" : [{
    "name" : "Patient",
    "use" : "out",
    "min" : 0,
    "max" : "1",
    "type" : "Patient"
  },
  {
    "name" : "Current Patient Age In Years",
    "use" : "out",
    "min" : 0,
    "max" : "1",
    "type" : "integer"
  },
  {
    "name" : "Hysterectomy Procedures",
    "use" : "out",
    "min" : 0,
    "max" : "*",
    "type" : "Procedure"
  },
  {
    "name" : "Has Had Hysterectomy",
    "use" : "out",
    "min" : 0,
    "max" : "1",
    "type" : "boolean"
  }],
  "dataRequirement" : [{
    "type" : "Procedure",
    "profile" : ["http://hl7.org/fhir/StructureDefinition/Procedure"]
  }],
  "content" : [{
    "contentType" : "text/cql",
    "data" : "LyoKICogTGlicmFyeTogQ1hDQUVsZW1lbnRzCiAqCiAqIFRIRSBIQVJNT05JWkFUSU9OIExBWUVSLgogKgogKiBBIHNoYXJlZCBDUUwgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHBlci1wYXRpZW50IHByZWRpY2F0ZXMgYW5kIGNvdW50cyBkZXJpdmVkCiAqIGZyb20gRkhJUiByZXNvdXJjZXMsIGNvbnN1bWVkIGJ5IGJvdGggdGhlIENEUy1zaWRlIExvZ2ljIGxpYnJhcmllcyAoZS5nLiwKICogQ1hDQUQyRFRTY3JlZW5pbmdFbGlnaWJpbGl0eUxvZ2ljKSBhbmQgdGhlIGVDUU0tc2lkZSBJbmRpY2F0b3IgbGlicmFyaWVzCiAqIChlLmcuLCBDWENBSU5EMDFMb2dpYykuIFRoZSBkZWZpbmVzIGJlbG93IGFyZSB0aGUgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aAogKiBmb3Igd2hhdCBjb3VudHMgYXMgImFuIEhQVisgcmVzdWx0LCIgImEgZG9jdW1lbnRlZCBoeXN0ZXJlY3RvbXksIiBldGMuCiAqCiAqIE1FVEhPRE9MT0dZIFBPSU5UICh0aGUgaGFybW9uaXphdGlvbiBwYXBlciBkaXN0aWxsZWQpOgogKgogKiAgIFdoZW4gQ0RTIGFza3MgImlzIHRoaXMgcGF0aWVudCBkdWUgZm9yIHNjcmVlbmluZyB0b2RheT8iIGFuZCBhbiBlQ1FNIGFza3MKICogICAid2hhdCAlIG9mIHRoZSBjb2hvcnQgZ290IHNjcmVlbmVkIGluIHRoZSBwZXJpb2Q/IiwgdGhleSBhc2sgZGlmZmVyZW50CiAqICAgKmFnZ3JlZ2F0aW9ucyogb2YgdGhlIHNhbWUgdW5kZXJseWluZyBjbGluaWNhbCBmYWN0OiAiZGlkIHRoaXMgcGF0aWVudAogKiAgIGdldCBzY3JlZW5lZD8iIElmIGJvdGggY29uc3VtZXJzIGNvbXB1dGUgdGhhdCBmYWN0IGluZGVwZW5kZW50bHksIHRoZXkKICogICBjYW4gZHJpZnQg4oCUIGFuZCB0aGUgcmVwb3J0IHN0b3BzIGFsaWduaW5nIHdpdGggdGhlIHJ1bGUgdGhhdCBkcm92ZSB0aGUKICogICBjYXJlLiBUaGUgZml4IGlzIHRvIGRlZmluZSB0aGUgdW5kZXJseWluZyBmYWN0IE9OQ0UgaW4gYSBzaGFyZWQgbGF5ZXIKICogICBhbmQgaGF2ZSBib3RoIGNvbnN1bWVycyByZWZlcmVuY2UgaXQuCiAqCiAqICAgSU1NWiByZWFsaXplcyB0aGlzIHdpdGggYElNTVpFbGVtZW50c2AgYW5kIGRpc2Vhc2Utc3BlY2lmaWMKICogICBgSU1NWkQyRFRNZWFzbGVzKkVsZW1lbnRzYCBsaWJyYXJpZXMuIFdlIG1pcnJvciB0aGF0IHBhdHRlcm4gaGVyZS4KICoKICogUGhhc2UgNSBjaHVuayA4IOKAlCBpbml0aWFsIGRlbW9uc3RyYXRpb24gc2V0LiBDdXJyZW50bHkgb25seSAiSGFzIEhhZAogKiBIeXN0ZXJlY3RvbXkiIGlzIG1hdGVyaWFsaXplZCBhcyBhIHJlYWwgRkhJUiBxdWVyeSAoUHJvY2VkdXJlIHdpdGgKICogQ1hDQS5EI0RFNDUpLiBTdWJzZXF1ZW50IGl0ZXJhdGlvbnMgd2lsbCBhZGQ6CiAqICAgLSBQZXItcGVyaW9kIEhQViByZXN1bHQgZXhpc3RlbmNlICh3aXRoIHBvc2l0aXZlL25lZ2F0aXZlIHZhbHVlIGNoZWNrKQogKiAgIC0gUGVyLXBlcmlvZCBjeXRvbG9neSByZXN1bHQgZXhpc3RlbmNlICh3aXRoIEJldGhlc2RhIHZhbHVlIGNoZWNrKQogKiAgIC0gUGVyLXBlcmlvZCBIUFYtbm90LWRvbmUgZXhpc3RlbmNlICh0aGUgUGhhc2UgNCBOb3REb25lIHBhdHRlcm4pCiAqICAgLSBUaW1lLXdpbmRvdyBoZWxwZXJzIChoYXNSZXN1bHRXaXRoaW4sIGlzRXhwZWN0ZWRCdXRNaXNzaW5nRm9yKQogKgogKiBFYWNoIG5ldyBkZWZpbmUgcmVwbGFjZXMgYSBwbGFjZWhvbGRlciBCb29sZWFuIHBhcmFtZXRlciBpbiBhIGRvd25zdHJlYW0KICogbGlicmFyeSDigJQgdGhpcyBpcyB0aGUgcGVyLWl0ZXJhdGlvbiBtaWdyYXRpb24gcGF0aCBmcm9tIHBsYWNlaG9sZGVyLUNRTAogKiB0byByZWFsLUZISVItcXVlcnktQ1FMLgogKi8KCmxpYnJhcnkgQ1hDQUVsZW1lbnRzIHZlcnNpb24gJzAuMC4xJwoKdXNpbmcgRkhJUiB2ZXJzaW9uICc0LjAuMScKCmluY2x1ZGUgRkhJUkhlbHBlcnMgdmVyc2lvbiAnNC4wLjEnCgpjb250ZXh0IFBhdGllbnQKCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIFBhdGllbnQgZGVtb2dyYXBoaWNzCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgovKgogKiBDdXJyZW50IHBhdGllbnQgYWdlIGluIHllYXJzLgogKi8KZGVmaW5lICJDdXJyZW50IFBhdGllbnQgQWdlIEluIFllYXJzIjoKICBBZ2VJblllYXJzKCkKCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIEh5c3RlcmVjdG9teSBoaXN0b3J5Ci8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgovKgogKiBAaW50ZXJuYWw6IEFsbCByZWNvcmRlZCBoeXN0ZXJlY3RvbXkgcHJvY2VkdXJlcyBmb3IgdGhpcyBwYXRpZW50LAogKiAgIGZpbHRlcmVkIHRvIHN0YXR1cyA9IGNvbXBsZXRlZC4KICovCmRlZmluZSAiSHlzdGVyZWN0b215IFByb2NlZHVyZXMiOgogIFtQcm9jZWR1cmVdIFAKICAgIHdoZXJlIFAuc3RhdHVzID0gJ2NvbXBsZXRlZCcKICAgICAgYW5kIGV4aXN0cyAoUC5jb2RlLmNvZGluZyBDIHdoZXJlIEMuY29kZSA9ICdERTQ1JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIEMuc3lzdGVtID0gJ2h0dHA6Ly9zbWFydC53aG8uaW50L2N4Y2EvQ29kZVN5c3RlbS9DWENBLkQnKQoKLyoKICogVGhlIHBhdGllbnQgaGFzIGEgZG9jdW1lbnRlZCBjb21wbGV0ZWQgaHlzdGVyZWN0b215LgogKgogKiBOT1RFOiBBLzY0MSBzZWN0aW9uIDIuMiBvbmx5IGV4Y2x1ZGVzIGh5c3RlcmVjdG9teSBmb3Igbm9uLWNlcnZpY2FsLWNhbmNlciBpbmRpY2F0aW9uCiAqIHdpdGggYSBkb2N1bWVudGVkIG5lZ2F0aXZlIHBvc3Qtb3AgdmFnaW5hbC1zbWVhciBjeXRvbG9neS4gVGhpcyBkZWZpbmUKICogY2FwdHVyZXMgb25seSB0aGUgaHlzdGVyZWN0b215IGZhY3Q7IHRoZSBpbmRpY2F0aW9uIGFuZCBwb3N0LW9wIGN5dG9sb2d5CiAqIGNoZWNrcyBsaXZlIGluIGhpZ2hlci1sYXllciBsb2dpYyB0aGF0IGNvbWJpbmVzIHRoaXMgZGVmaW5lIHdpdGggb3RoZXJzLgogKi8KZGVmaW5lICJIYXMgSGFkIEh5c3RlcmVjdG9teSI6CiAgZXhpc3RzICJIeXN0ZXJlY3RvbXkgUHJvY2VkdXJlcyIK"
  },
  {
    "contentType" : "application/elm+xml",
    "data" : "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPGxpYnJhcnkgeG1sbnM9InVybjpobDctb3JnOmVsbTpyMSIgeG1sbnM6dD0idXJuOmhsNy1vcmc6ZWxtLXR5cGVzOnIxIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczpmaGlyPSJodHRwOi8vaGw3Lm9yZy9maGlyIiB4bWxuczpxZG00Mz0idXJuOmhlYWx0aGl0LWdvdjpxZG06djRfMyIgeG1sbnM6cWRtNTM9InVybjpoZWFsdGhpdC1nb3Y6cWRtOnY1XzMiIHhtbG5zOmE9InVybjpobDctb3JnOmNxbC1hbm5vdGF0aW9uczpyMSIgbG9jYWxJZD0iMCI+CiAgIDxhbm5vdGF0aW9uIHRyYW5zbGF0b3JPcHRpb25zPSJFbmFibGVBbm5vdGF0aW9ucyxFbmFibGVMb2NhdG9ycyxEaXNhYmxlTGlzdERlbW90aW9uLERpc2FibGVMaXN0UHJvbW90aW9uIiBzaWduYXR1cmVMZXZlbD0iT3ZlcmxvYWRzIiB4c2k6dHlwZT0iYTpDcWxUb0VsbUluZm8iLz4KICAgPGFubm90YXRpb24gbWVzc2FnZT0iQW4gb3BlcmFuZCBpZGVudGlmaWVyIHJlZmVyZW5jZSBpcyBoaWRpbmcgYW5vdGhlciBpZGVudGlmaWVyIG9mIHRoZSBzYW1lIG5hbWUuIiBlcnJvclR5cGU9InNlbWFudGljIiBlcnJvclNldmVyaXR5PSJ3YXJuaW5nIiB4c2k6dHlwZT0iYTpDcWxUb0VsbUVycm9yIi8+CiAgIDxhbm5vdGF0aW9uIG1lc3NhZ2U9IkFuIG9wZXJhbmQgaWRlbnRpZmllciByZWZlcmVuY2UgaXMgaGlkaW5nIGFub3RoZXIgaWRlbnRpZmllciBvZiB0aGUgc2FtZSBuYW1lLiIgZXJyb3JUeXBlPSJzZW1hbnRpYyIgZXJyb3JTZXZlcml0eT0id2FybmluZyIgeHNpOnR5cGU9ImE6Q3FsVG9FbG1FcnJvciIvPgogICA8YW5ub3RhdGlvbiBtZXNzYWdlPSJBbiBvcGVyYW5kIGlkZW50aWZpZXIgcmVmZXJlbmNlIGlzIGhpZGluZyBhbm90aGVyIGlkZW50aWZpZXIgb2YgdGhlIHNhbWUgbmFtZS4iIGVycm9yVHlwZT0ic2VtYW50aWMiIGVycm9yU2V2ZXJpdHk9Indhcm5pbmciIHhzaTp0eXBlPSJhOkNxbFRvRWxtRXJyb3IiLz4KICAgPGFubm90YXRpb24geHNpOnR5cGU9ImE6QW5ub3RhdGlvbiI+CiAgICAgIDxhOnMgcj0iMjY4Ij4KICAgICAgICAgPGE6cz4vKgogKiBMaWJyYXJ5OiBDWENBRWxlbWVudHMKICoKICogVEhFIEhBUk1PTklaQVRJT04gTEFZRVIuCiAqCiAqIEEgc2hhcmVkIENRTCBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgcGVyLXBhdGllbnQgcHJlZGljYXRlcyBhbmQgY291bnRzIGRlcml2ZWQKICogZnJvbSBGSElSIHJlc291cmNlcywgY29uc3VtZWQgYnkgYm90aCB0aGUgQ0RTLXNpZGUgTG9naWMgbGlicmFyaWVzIChlLmcuLAogKiBDWENBRDJEVFNjcmVlbmluZ0VsaWdpYmlsaXR5TG9naWMpIGFuZCB0aGUgZUNRTS1zaWRlIEluZGljYXRvciBsaWJyYXJpZXMKICogKGUuZy4sIENYQ0FJTkQwMUxvZ2ljKS4gVGhlIGRlZmluZXMgYmVsb3cgYXJlIHRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoCiAqIGZvciB3aGF0IGNvdW50cyBhcyAmcXVvdDthbiBIUFYrIHJlc3VsdCwmcXVvdDsgJnF1b3Q7YSBkb2N1bWVudGVkIGh5c3RlcmVjdG9teSwmcXVvdDsgZXRjLgogKgogKiBNRVRIT0RPTE9HWSBQT0lOVCAodGhlIGhhcm1vbml6YXRpb24gcGFwZXIgZGlzdGlsbGVkKToKICoKICogICBXaGVuIENEUyBhc2tzICZxdW90O2lzIHRoaXMgcGF0aWVudCBkdWUgZm9yIHNjcmVlbmluZyB0b2RheT8mcXVvdDsgYW5kIGFuIGVDUU0gYXNrcwogKiAgICZxdW90O3doYXQgJSBvZiB0aGUgY29ob3J0IGdvdCBzY3JlZW5lZCBpbiB0aGUgcGVyaW9kPyZxdW90OywgdGhleSBhc2sgZGlmZmVyZW50CiAqICAgKmFnZ3JlZ2F0aW9ucyogb2YgdGhlIHNhbWUgdW5kZXJseWluZyBjbGluaWNhbCBmYWN0OiAmcXVvdDtkaWQgdGhpcyBwYXRpZW50CiAqICAgZ2V0IHNjcmVlbmVkPyZxdW90OyBJZiBib3RoIGNvbnN1bWVycyBjb21wdXRlIHRoYXQgZmFjdCBpbmRlcGVuZGVudGx5LCB0aGV5CiAqICAgY2FuIGRyaWZ0IOKAlCBhbmQgdGhlIHJlcG9ydCBzdG9wcyBhbGlnbmluZyB3aXRoIHRoZSBydWxlIHRoYXQgZHJvdmUgdGhlCiAqICAgY2FyZS4gVGhlIGZpeCBpcyB0byBkZWZpbmUgdGhlIHVuZGVybHlpbmcgZmFjdCBPTkNFIGluIGEgc2hhcmVkIGxheWVyCiAqICAgYW5kIGhhdmUgYm90aCBjb25zdW1lcnMgcmVmZXJlbmNlIGl0LgogKgogKiAgIElNTVogcmVhbGl6ZXMgdGhpcyB3aXRoIGBJTU1aRWxlbWVudHNgIGFuZCBkaXNlYXNlLXNwZWNpZmljCiAqICAgYElNTVpEMkRUTWVhc2xlcypFbGVtZW50c2AgbGlicmFyaWVzLiBXZSBtaXJyb3IgdGhhdCBwYXR0ZXJuIGhlcmUuCiAqCiAqIFBoYXNlIDUgY2h1bmsgOCDigJQgaW5pdGlhbCBkZW1vbnN0cmF0aW9uIHNldC4gQ3VycmVudGx5IG9ubHkgJnF1b3Q7SGFzIEhhZAogKiBIeXN0ZXJlY3RvbXkmcXVvdDsgaXMgbWF0ZXJpYWxpemVkIGFzIGEgcmVhbCBGSElSIHF1ZXJ5IChQcm9jZWR1cmUgd2l0aAogKiBDWENBLkQjREU0NSkuIFN1YnNlcXVlbnQgaXRlcmF0aW9ucyB3aWxsIGFkZDoKICogICAtIFBlci1wZXJpb2QgSFBWIHJlc3VsdCBleGlzdGVuY2UgKHdpdGggcG9zaXRpdmUvbmVnYXRpdmUgdmFsdWUgY2hlY2spCiAqICAgLSBQZXItcGVyaW9kIGN5dG9sb2d5IHJlc3VsdCBleGlzdGVuY2UgKHdpdGggQmV0aGVzZGEgdmFsdWUgY2hlY2spCiAqICAgLSBQZXItcGVyaW9kIEhQVi1ub3QtZG9uZSBleGlzdGVuY2UgKHRoZSBQaGFzZSA0IE5vdERvbmUgcGF0dGVybikKICogICAtIFRpbWUtd2luZG93IGhlbHBlcnMgKGhhc1Jlc3VsdFdpdGhpbiwgaXNFeHBlY3RlZEJ1dE1pc3NpbmdGb3IpCiAqCiAqIEVhY2ggbmV3IGRlZmluZSByZXBsYWNlcyBhIHBsYWNlaG9sZGVyIEJvb2xlYW4gcGFyYW1ldGVyIGluIGEgZG93bnN0cmVhbQogKiBsaWJyYXJ5IOKAlCB0aGlzIGlzIHRoZSBwZXItaXRlcmF0aW9uIG1pZ3JhdGlvbiBwYXRoIGZyb20gcGxhY2Vob2xkZXItQ1FMCiAqIHRvIHJlYWwtRkhJUi1xdWVyeS1DUUwuCiAqLwoKbGlicmFyeSBDWENBRWxlbWVudHMgdmVyc2lvbiAnMC4wLjEnPC9hOnM+CiAgICAgIDwvYTpzPgogICA8L2Fubm90YXRpb24+CiAgIDxpZGVudGlmaWVyIGlkPSJDWENBRWxlbWVudHMiIHN5c3RlbT0iaHR0cDovL3NtYXJ0Lndoby5pbnQvY3hjYSIgdmVyc2lvbj0iMC4wLjEiLz4KICAgPHNjaGVtYUlkZW50aWZpZXIgaWQ9InVybjpobDctb3JnOmVsbSIgdmVyc2lvbj0icjEiLz4KICAgPHVzaW5ncz4KICAgICAgPGRlZiBsb2NhbElkPSIxIiBsb2NhbElkZW50aWZpZXI9IlN5c3RlbSIgdXJpPSJ1cm46aGw3LW9yZzplbG0tdHlwZXM6cjEiIHZlcnNpb249IjEuMC4wIi8+CiAgICAgIDxkZWYgbG9jYWxJZD0iMjA2IiBsb2NhdG9yPSI0MDoxLTQwOjI2IiBsb2NhbElkZW50aWZpZXI9IkZISVIiIHVyaT0iaHR0cDovL2hsNy5vcmcvZmhpciIgdmVyc2lvbj0iNC4wLjEiPgogICAgICAgICA8YW5ub3RhdGlvbiB4c2k6dHlwZT0iYTpBbm5vdGF0aW9uIj4KICAgICAgICAgICAgPGE6cyByPSIyMDYiPgogICAgICAgICAgICAgICA8YTpzPnVzaW5nIDwvYTpzPgogICAgICAgICAgICAgICA8YTpzPgogICAgICAgICAgICAgICAgICA8YTpzPkZISVI8L2E6cz4KICAgICAgICAgICAgICAgPC9hOnM+CiAgICAgICAgICAgICAgIDxhOnM+IHZlcnNpb24gJzQuMC4xJzwvYTpzPgogICAgICAgICAgICA8L2E6cz4KICAgICAgICAgPC9hbm5vdGF0aW9uPgogICAgICA8L2RlZj4KICAgPC91c2luZ3M+CiAgIDxpbmNsdWRlcz4KICAgICAgPGRlZiBsb2NhbElkPSIyMDgiIGxvY2F0b3I9IjQyOjEtNDI6MzUiIGxvY2FsSWRlbnRpZmllcj0iRkhJUkhlbHBlcnMiIHBhdGg9Imh0dHA6Ly9obDcub3JnL2ZoaXIvRkhJUkhlbHBlcnMiIHZlcnNpb249IjQuMC4xIj4KICAgICAgICAgPGFubm90YXRpb24geHNpOnR5cGU9ImE6QW5ub3RhdGlvbiI+CiAgICAgICAgICAgIDxhOnMgcj0iMjA4Ij4KICAgICAgICAgICAgICAgPGE6cz5pbmNsdWRlIDwvYTpzPgogICAgICAgICAgICAgICA8YTpzPgogICAgICAgICAgICAgICAgICA8YTpzPkZISVJIZWxwZXJzPC9hOnM+CiAgICAgICAgICAgICAgIDwvYTpzPgogICAgICAgICAgICAgICA8YTpzPiB2ZXJzaW9uICc0LjAuMSc8L2E6cz4KICAgICAgICAgICAgPC9hOnM+CiAgICAgICAgIDwvYW5ub3RhdGlvbj4KICAgICAgPC9kZWY+CiAgIDwvaW5jbHVkZXM+CiAgIDxjb250ZXh0cz4KICAgICAgPGRlZiBsb2NhbElkPSIyMTMiIGxvY2F0b3I9IjQ0OjEtNDQ6MTUiIG5hbWU9IlBhdGllbnQiLz4KICAgPC9jb250ZXh0cz4KICAgPHN0YXRlbWVudHM+CiAgICAgIDxkZWYgbG9jYWxJZD0iMjExIiBsb2NhdG9yPSI0NDoxLTQ0OjE1IiBuYW1lPSJQYXRpZW50IiBjb250ZXh0PSJQYXRpZW50Ij4KICAgICAgICAgPGV4cHJlc3Npb24gbG9jYWxJZD0iMjEyIiB4c2k6dHlwZT0iU2luZ2xldG9uRnJvbSI+CiAgICAgICAgICAgIDxvcGVyYW5kIGxvY2FsSWQ9IjIxMCIgbG9jYXRvcj0iNDQ6MS00NDoxNSIgZGF0YVR5cGU9ImZoaXI6UGF0aWVudCIgdGVtcGxhdGVJZD0iaHR0cDovL2hsNy5vcmcvZmhpci9TdHJ1Y3R1cmVEZWZpbml0aW9uL1BhdGllbnQiIHhzaTp0eXBlPSJSZXRyaWV2ZSIvPgogICAgICAgICA8L2V4cHJlc3Npb24+CiAgICAgIDwvZGVmPgogICAgICA8ZGVmIGxvY2FsSWQ9IjIxNiIgbG9jYXRvcj0iNTM6MS01NDoxNCIgbmFtZT0iQ3VycmVudCBQYXRpZW50IEFnZSBJbiBZZWFycyIgY29udGV4dD0iUGF0aWVudCIgYWNjZXNzTGV2ZWw9IlB1YmxpYyI+CiAgICAgICAgIDxhbm5vdGF0aW9uIHhzaTp0eXBlPSJhOkFubm90YXRpb24iPgogICAgICAgICAgICA8YTpzIHI9IjIxNiI+CiAgICAgICAgICAgICAgIDxhOnM+Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gUGF0aWVudCBkZW1vZ3JhcGhpY3MKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCi8qCiAqIEN1cnJlbnQgcGF0aWVudCBhZ2UgaW4geWVhcnMuCiAqLwpkZWZpbmUgJnF1b3Q7Q3VycmVudCBQYXRpZW50IEFnZSBJbiBZZWFycyZxdW90OzoKICA8L2E6cz4KICAgICAgICAgICAgICAgPGE6cyByPSIyMjEiPgogICAgICAgICAgICAgICAgICA8YTpzPkFnZUluWWVhcnMoKTwvYTpzPgogICAgICAgICAgICAgICA8L2E6cz4KICAgICAgICAgICAgPC9hOnM+CiAgICAgICAgIDwvYW5ub3RhdGlvbj4KICAgICAgICAgPGV4cHJlc3Npb24gbG9jYWxJZD0iMjIxIiBsb2NhdG9yPSI1NDozLTU0OjE0IiBwcmVjaXNpb249IlllYXIiIHhzaTp0eXBlPSJDYWxjdWxhdGVBZ2UiPgogICAgICAgICAgICA8c2lnbmF0dXJlIGxvY2FsSWQ9IjIyMiIgbmFtZT0idDpEYXRlIiB4c2k6dHlwZT0iTmFtZWRUeXBlU3BlY2lmaWVyIi8+CiAgICAgICAgICAgIDxvcGVyYW5kIGxvY2FsSWQ9IjIyMCIgcGF0aD0iYmlydGhEYXRlLnZhbHVlIiB4c2k6dHlwZT0iUHJvcGVydHkiPgogICAgICAgICAgICAgICA8c291cmNlIGxvY2FsSWQ9IjIxOSIgbmFtZT0iUGF0aWVudCIgeHNpOnR5cGU9IkV4cHJlc3Npb25SZWYiLz4KICAgICAgICAgICAgPC9vcGVyYW5kPgogICAgICAgICA8L2V4cHJlc3Npb24+CiAgICAgIDwvZGVmPgogICAgICA8ZGVmIGxvY2FsSWQ9IjIyNSIgbG9jYXRvcj0iNjQ6MS02ODo5OCIgbmFtZT0iSHlzdGVyZWN0b215IFByb2NlZHVyZXMiIGNvbnRleHQ9IlBhdGllbnQiIGFjY2Vzc0xldmVsPSJQdWJsaWMiPgogICAgICAgICA8YW5ub3RhdGlvbiB4c2k6dHlwZT0iYTpBbm5vdGF0aW9uIj4KICAgICAgICAgICAgPGE6dCBuYW1lPSJpbnRlcm5hbCIgdmFsdWU9IkFsbCByZWNvcmRlZCBoeXN0ZXJlY3RvbXkgcHJvY2VkdXJlcyBmb3IgdGhpcyBwYXRpZW50LCYjeGE7ZmlsdGVyZWQgdG8gc3RhdHVzID0gY29tcGxldGVkLiIvPgogICAgICAgICAgICA8YTpzIHI9IjIyNSI+CiAgICAgICAgICAgICAgIDxhOnM+Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gSHlzdGVyZWN0b215IGhpc3RvcnkKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCi8qCiAqIEBpbnRlcm5hbDogQWxsIHJlY29yZGVkIGh5c3RlcmVjdG9teSBwcm9jZWR1cmVzIGZvciB0aGlzIHBhdGllbnQsCiAqICAgZmlsdGVyZWQgdG8gc3RhdHVzID0gY29tcGxldGVkLgogKi8KZGVmaW5lICZxdW90O0h5c3RlcmVjdG9teSBQcm9jZWR1cmVzJnF1b3Q7OgogIDwvYTpzPgogICAgICAgICAgICAgICA8YTpzIHI9IjI2NSI+CiAgICAgICAgICAgICAgICAgIDxhOnM+CiAgICAgICAgICAgICAgICAgICAgIDxhOnMgcj0iMjI2Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGE6cyByPSIyMjciPgogICAgICAgICAgICAgICAgICAgICAgICAgICA8YTpzIHI9IjIyNyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhOnM+W1Byb2NlZHVyZV08L2E6cz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hOnM+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvYTpzPgogICAgICAgICAgICAgICAgICAgICAgICA8YTpzPiBQPC9hOnM+CiAgICAgICAgICAgICAgICAgICAgIDwvYTpzPgogICAgICAgICAgICAgICAgICA8L2E6cz4KICAgICAgICAgICAgICAgICAgPGE6cz4KICAgIDwvYTpzPgogICAgICAgICAgICAgICAgICA8YTpzIHI9IjIyOSI+CiAgICAgICAgICAgICAgICAgICAgIDxhOnM+d2hlcmUgPC9hOnM+CiAgICAgICAgICAgICAgICAgICAgIDxhOnMgcj0iMjI5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGE6cyByPSIyMzAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICA8YTpzIHI9IjIzMiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhOnMgcj0iMjMxIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGE6cz5QPC9hOnM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYTpzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YTpzPi48L2E6cz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGE6cyByPSIyMzIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YTpzPnN0YXR1czwvYTpzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E6cz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hOnM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhOnM+ID0gPC9hOnM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhOnMgcj0iMjMzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGE6cz4nY29tcGxldGVkJzwvYTpzPgogICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E6cz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9hOnM+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhOnM+CiAgICAgIGFuZCA8L2E6cz4KICAgICAgICAgICAgICAgICAgICAgICAgPGE6cyByPSIyMzkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICA8YTpzPmV4aXN0cyA8L2E6cz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGE6cyByPSIyNjQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YTpzPig8L2E6cz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGE6cyByPSIyNjQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YTpzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YTpzIHI9IjI0MCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhOnMgcj0iMjQzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGE6cz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGE6cz5QLmNvZGUuY29kaW5nPC9hOnM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYTpzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E6cz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGE6cz4gQzwvYTpzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E6cz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hOnM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhOnM+IDwvYTpzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YTpzIHI9IjI0NSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhOnM+d2hlcmUgPC9hOnM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhOnMgcj0iMjQ1Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGE6cyByPSIyNDYiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YTpzIHI9IjI0OCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhOnMgcj0iMjQ3Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGE6cz5DPC9hOnM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYTpzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YTpzPi48L2E6cz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGE6cyByPSIyNDgiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YTpzPmNvZGU8L2E6cz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hOnM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYTpzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YTpzPiA9IDwvYTpzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YTpzIHI9IjI0OSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhOnM+J0RFNDUnPC9hOnM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYTpzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E6cz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGE6cz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCA8L2E6cz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGE6cyByPSIyNTUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YTpzIHI9IjI1NyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhOnMgcj0iMjU2Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGE6cz5DPC9hOnM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYTpzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YTpzPi48L2E6cz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGE6cyByPSIyNTciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YTpzPnN5c3RlbTwvYTpzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E6cz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hOnM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhOnM+ID0gPC9hOnM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhOnMgcj0iMjU4Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGE6cz4naHR0cDovL3NtYXJ0Lndoby5pbnQvY3hjYS9Db2RlU3lzdGVtL0NYQ0EuRCc8L2E6cz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hOnM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYTpzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E6cz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hOnM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYTpzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YTpzPik8L2E6cz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hOnM+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvYTpzPgogICAgICAgICAgICAgICAgICAgICA8L2E6cz4KICAgICAgICAgICAgICAgICAgPC9hOnM+CiAgICAgICAgICAgICAgIDwvYTpzPgogICAgICAgICAgICA8L2E6cz4KICAgICAgICAgPC9hbm5vdGF0aW9uPgogICAgICAgICA8ZXhwcmVzc2lvbiBsb2NhbElkPSIyNjUiIGxvY2F0b3I9IjY1OjMtNjg6OTgiIHhzaTp0eXBlPSJRdWVyeSI+CiAgICAgICAgICAgIDxzb3VyY2UgbG9jYWxJZD0iMjI2IiBsb2NhdG9yPSI2NTozLTY1OjE1IiBhbGlhcz0iUCI+CiAgICAgICAgICAgICAgIDxleHByZXNzaW9uIGxvY2FsSWQ9IjIyNyIgbG9jYXRvcj0iNjU6My02NToxMyIgZGF0YVR5cGU9ImZoaXI6UHJvY2VkdXJlIiB0ZW1wbGF0ZUlkPSJodHRwOi8vaGw3Lm9yZy9maGlyL1N0cnVjdHVyZURlZmluaXRpb24vUHJvY2VkdXJlIiB4c2k6dHlwZT0iUmV0cmlldmUiLz4KICAgICAgICAgICAgPC9zb3VyY2U+CiAgICAgICAgICAgIDx3aGVyZSBsb2NhbElkPSIyMjkiIGxvY2F0b3I9IjY2OjUtNjg6OTgiIHhzaTp0eXBlPSJBbmQiPgogICAgICAgICAgICAgICA8b3BlcmFuZCBsb2NhbElkPSIyMzAiIGxvY2F0b3I9IjY2OjExLTY2OjMyIiB4c2k6dHlwZT0iRXF1YWwiPgogICAgICAgICAgICAgICAgICA8c2lnbmF0dXJlIGxvY2FsSWQ9IjIzNyIgbmFtZT0idDpTdHJpbmciIHhzaTp0eXBlPSJOYW1lZFR5cGVTcGVjaWZpZXIiLz4KICAgICAgICAgICAgICAgICAgPHNpZ25hdHVyZSBsb2NhbElkPSIyMzgiIG5hbWU9InQ6U3RyaW5nIiB4c2k6dHlwZT0iTmFtZWRUeXBlU3BlY2lmaWVyIi8+CiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIGxvY2FsSWQ9IjIzNSIgbmFtZT0iVG9TdHJpbmciIGxpYnJhcnlOYW1lPSJGSElSSGVscGVycyIgeHNpOnR5cGU9IkZ1bmN0aW9uUmVmIj4KICAgICAgICAgICAgICAgICAgICAgPHNpZ25hdHVyZSBsb2NhbElkPSIyMzYiIG5hbWU9ImZoaXI6UHJvY2VkdXJlU3RhdHVzIiB4c2k6dHlwZT0iTmFtZWRUeXBlU3BlY2lmaWVyIi8+CiAgICAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIGxvY2FsSWQ9IjIzMiIgbG9jYXRvcj0iNjY6MTEtNjY6MTgiIHBhdGg9InN0YXR1cyIgc2NvcGU9IlAiIHhzaTp0eXBlPSJQcm9wZXJ0eSIvPgogICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+CiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIGxvY2FsSWQ9IjIzMyIgbG9jYXRvcj0iNjY6MjItNjY6MzIiIHZhbHVlVHlwZT0idDpTdHJpbmciIHZhbHVlPSJjb21wbGV0ZWQiIHhzaTp0eXBlPSJMaXRlcmFsIi8+CiAgICAgICAgICAgICAgIDwvb3BlcmFuZD4KICAgICAgICAgICAgICAgPG9wZXJhbmQgbG9jYWxJZD0iMjM5IiBsb2NhdG9yPSI2NzoxMS02ODo5OCIgeHNpOnR5cGU9IkV4aXN0cyI+CiAgICAgICAgICAgICAgICAgIDxvcGVyYW5kIGxvY2FsSWQ9IjI2NCIgbG9jYXRvcj0iNjc6MTgtNjg6OTgiIHhzaTp0eXBlPSJRdWVyeSI+CiAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgbG9jYWxJZD0iMjQwIiBsb2NhdG9yPSI2NzoxOS02NzozMyIgYWxpYXM9IkMiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZXhwcmVzc2lvbiBsb2NhbElkPSIyNDMiIGxvY2F0b3I9IjY3OjE5LTY3OjMxIiBwYXRoPSJjb2RpbmciIHhzaTp0eXBlPSJQcm9wZXJ0eSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2UgbG9jYWxJZD0iMjQyIiBwYXRoPSJjb2RlIiBzY29wZT0iUCIgeHNpOnR5cGU9IlByb3BlcnR5Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhwcmVzc2lvbj4KICAgICAgICAgICAgICAgICAgICAgPC9zb3VyY2U+CiAgICAgICAgICAgICAgICAgICAgIDx3aGVyZSBsb2NhbElkPSIyNDUiIGxvY2F0b3I9IjY3OjM1LTY4Ojk3IiB4c2k6dHlwZT0iQW5kIj4KICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgbG9jYWxJZD0iMjQ2IiBsb2NhdG9yPSI2Nzo0MS02Nzo1NSIgeHNpOnR5cGU9IkVxdWFsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNpZ25hdHVyZSBsb2NhbElkPSIyNTMiIG5hbWU9InQ6U3RyaW5nIiB4c2k6dHlwZT0iTmFtZWRUeXBlU3BlY2lmaWVyIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaWduYXR1cmUgbG9jYWxJZD0iMjU0IiBuYW1lPSJ0OlN0cmluZyIgeHNpOnR5cGU9Ik5hbWVkVHlwZVNwZWNpZmllciIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBsb2NhbElkPSIyNTEiIG5hbWU9IlRvU3RyaW5nIiBsaWJyYXJ5TmFtZT0iRkhJUkhlbHBlcnMiIHhzaTp0eXBlPSJGdW5jdGlvblJlZiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaWduYXR1cmUgbG9jYWxJZD0iMjUyIiBuYW1lPSJmaGlyOnN0cmluZyIgeHNpOnR5cGU9Ik5hbWVkVHlwZVNwZWNpZmllciIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBsb2NhbElkPSIyNDgiIGxvY2F0b3I9IjY3OjQxLTY3OjQ2IiBwYXRoPSJjb2RlIiBzY29wZT0iQyIgeHNpOnR5cGU9IlByb3BlcnR5Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgbG9jYWxJZD0iMjQ5IiBsb2NhdG9yPSI2Nzo1MC02Nzo1NSIgdmFsdWVUeXBlPSJ0OlN0cmluZyIgdmFsdWU9IkRFNDUiIHhzaTp0eXBlPSJMaXRlcmFsIi8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3BlcmFuZD4KICAgICAgICAgICAgICAgICAgICAgICAgPG9wZXJhbmQgbG9jYWxJZD0iMjU1IiBsb2NhdG9yPSI2ODo0Mi02ODo5NyIgeHNpOnR5cGU9IkVxdWFsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNpZ25hdHVyZSBsb2NhbElkPSIyNjIiIG5hbWU9InQ6U3RyaW5nIiB4c2k6dHlwZT0iTmFtZWRUeXBlU3BlY2lmaWVyIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaWduYXR1cmUgbG9jYWxJZD0iMjYzIiBuYW1lPSJ0OlN0cmluZyIgeHNpOnR5cGU9Ik5hbWVkVHlwZVNwZWNpZmllciIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBsb2NhbElkPSIyNjAiIG5hbWU9IlRvU3RyaW5nIiBsaWJyYXJ5TmFtZT0iRkhJUkhlbHBlcnMiIHhzaTp0eXBlPSJGdW5jdGlvblJlZiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaWduYXR1cmUgbG9jYWxJZD0iMjYxIiBuYW1lPSJmaGlyOnVyaSIgeHNpOnR5cGU9Ik5hbWVkVHlwZVNwZWNpZmllciIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBsb2NhbElkPSIyNTciIGxvY2F0b3I9IjY4OjQyLTY4OjQ5IiBwYXRoPSJzeXN0ZW0iIHNjb3BlPSJDIiB4c2k6dHlwZT0iUHJvcGVydHkiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPgogICAgICAgICAgICAgICAgICAgICAgICAgICA8b3BlcmFuZCBsb2NhbElkPSIyNTgiIGxvY2F0b3I9IjY4OjUzLTY4Ojk3IiB2YWx1ZVR5cGU9InQ6U3RyaW5nIiB2YWx1ZT0iaHR0cDovL3NtYXJ0Lndoby5pbnQvY3hjYS9Db2RlU3lzdGVtL0NYQ0EuRCIgeHNpOnR5cGU9IkxpdGVyYWwiLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9vcGVyYW5kPgogICAgICAgICAgICAgICAgICAgICA8L3doZXJlPgogICAgICAgICAgICAgICAgICA8L29wZXJhbmQ+CiAgICAgICAgICAgICAgIDwvb3BlcmFuZD4KICAgICAgICAgICAgPC93aGVyZT4KICAgICAgICAgPC9leHByZXNzaW9uPgogICAgICA8L2RlZj4KICAgICAgPGRlZiBsb2NhbElkPSIyNjgiIGxvY2F0b3I9Ijc4OjEtNzk6MzQiIG5hbWU9IkhhcyBIYWQgSHlzdGVyZWN0b215IiBjb250ZXh0PSJQYXRpZW50IiBhY2Nlc3NMZXZlbD0iUHVibGljIj4KICAgICAgICAgPGFubm90YXRpb24geHNpOnR5cGU9ImE6QW5ub3RhdGlvbiI+CiAgICAgICAgICAgIDxhOnMgcj0iMjY4Ij4KICAgICAgICAgICAgICAgPGE6cz4vKgogKiBUaGUgcGF0aWVudCBoYXMgYSBkb2N1bWVudGVkIGNvbXBsZXRlZCBoeXN0ZXJlY3RvbXkuCiAqCiAqIE5PVEU6IEEvNjQxIHNlY3Rpb24gMi4yIG9ubHkgZXhjbHVkZXMgaHlzdGVyZWN0b215IGZvciBub24tY2VydmljYWwtY2FuY2VyIGluZGljYXRpb24KICogd2l0aCBhIGRvY3VtZW50ZWQgbmVnYXRpdmUgcG9zdC1vcCB2YWdpbmFsLXNtZWFyIGN5dG9sb2d5LiBUaGlzIGRlZmluZQogKiBjYXB0dXJlcyBvbmx5IHRoZSBoeXN0ZXJlY3RvbXkgZmFjdDsgdGhlIGluZGljYXRpb24gYW5kIHBvc3Qtb3AgY3l0b2xvZ3kKICogY2hlY2tzIGxpdmUgaW4gaGlnaGVyLWxheWVyIGxvZ2ljIHRoYXQgY29tYmluZXMgdGhpcyBkZWZpbmUgd2l0aCBvdGhlcnMuCiAqLwpkZWZpbmUgJnF1b3Q7SGFzIEhhZCBIeXN0ZXJlY3RvbXkmcXVvdDs6CiAgPC9hOnM+CiAgICAgICAgICAgICAgIDxhOnMgcj0iMjY5Ij4KICAgICAgICAgICAgICAgICAgPGE6cz5leGlzdHMgPC9hOnM+CiAgICAgICAgICAgICAgICAgIDxhOnMgcj0iMjcwIj4KICAgICAgICAgICAgICAgICAgICAgPGE6cz4mcXVvdDtIeXN0ZXJlY3RvbXkgUHJvY2VkdXJlcyZxdW90OzwvYTpzPgogICAgICAgICAgICAgICAgICA8L2E6cz4KICAgICAgICAgICAgICAgPC9hOnM+CiAgICAgICAgICAgIDwvYTpzPgogICAgICAgICA8L2Fubm90YXRpb24+CiAgICAgICAgIDxleHByZXNzaW9uIGxvY2FsSWQ9IjI2OSIgbG9jYXRvcj0iNzk6My03OTozNCIgeHNpOnR5cGU9IkV4aXN0cyI+CiAgICAgICAgICAgIDxzaWduYXR1cmUgbG9jYWxJZD0iMjcxIiB4c2k6dHlwZT0iTGlzdFR5cGVTcGVjaWZpZXIiPgogICAgICAgICAgICAgICA8ZWxlbWVudFR5cGUgbG9jYWxJZD0iMjcyIiBuYW1lPSJmaGlyOlByb2NlZHVyZSIgeHNpOnR5cGU9Ik5hbWVkVHlwZVNwZWNpZmllciIvPgogICAgICAgICAgICA8L3NpZ25hdHVyZT4KICAgICAgICAgICAgPG9wZXJhbmQgbG9jYWxJZD0iMjcwIiBsb2NhdG9yPSI3OToxMC03OTozNCIgbmFtZT0iSHlzdGVyZWN0b215IFByb2NlZHVyZXMiIHhzaTp0eXBlPSJFeHByZXNzaW9uUmVmIi8+CiAgICAgICAgIDwvZXhwcmVzc2lvbj4KICAgICAgPC9kZWY+CiAgIDwvc3RhdGVtZW50cz4KPC9saWJyYXJ5Pgo="
  }]
}